如何从setuptools安装程序(setup.py)中生成python grpc代码?
问题内容:
我们在仓库中有一些gRPC的原始文件,我读到提交生成的代码不好。所以我认为我需要将这一代作为软件包安装的一部分(例如setuptools,setup.py)
但是,要生成gRPC代码,您需要首先pip install grpcio- tools
根据docs进行运行以安装该软件包。但是setup.py的目的是自动下拉依赖项,例如
grpcio-tools 。
那么,这样做是否有最佳实践?就像在其中一样,如何从setuptools内生成依赖于另一个python包的代码?我最好只是创建一个单独的build.sh
脚本来手动pip安装并生成代码吗?还是我应该期望该软件包的用户已经安装了
grpcio工具 ?
问题答案:
据我所知,“当前”的最佳实践是:
- 点管理依赖
- setup.py执行构建
执行“ pip install”。几乎等同于执行“ pip install -r requirements.txt” +“ python setup.py
build” +“ python setup.py install”。
这是一个自定义命令,可从原始文件生成python源:
class GrpcTool (Command):
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
import grpc_tools.protoc
proto_include = pkg_resources.resource_filename('grpc_tools', '_proto')
grpc_tools.protoc.main([
'grpc_tools.protoc',
'-I{}'.format(proto_include),
'--python_out=SOME_PATH/',
'--grpc_python_out=SOME_PATH/',
'SOME_PROTO.proto'
])
通过定制build_py命令调用,如下所示:
class BuildPyCommand (build_py):
def run(self):
self.run_command('grpc')
super(BuildPyCommand, self).run()
注意导入 内部 的run方法。在安装要求之前和之后,pip似乎多次运行setup.py。因此,如果将导入放在文件之上,则构建将失败。