How do I generate python grpc code from within a setuptools installer (setup.py)?
我们在回购中有一些gRPC的原始文件,我读到提交生成的代码不好。所以我认为我需要将这一代作为软件包安装的一部分(例如setuptools,setup.py)
但是,要生成gRPC代码,您需要根据文档首先通过运行
那么这样做是否有最佳实践?就像在其中一样,如何从setuptools内生成依赖于另一个python包的代码?我最好还是创建一个单独的
据我所知,"当前"最佳实践是:
- pip管理依赖项
- setup.py执行构建
执行" pip install"。几乎等同于执行" pip install -r requirements.txt"" python setup.py build"" python setup.py install"。
这是一个自定义命令,可从原始文件生成python源:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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命令调用的,如下所示:
1 2 3 4 | class BuildPyCommand (build_py): def run(self): self.run_command('grpc') super(BuildPyCommand, self).run() |
请注意run方法中的导入。在安装需求之前和之后,pip似乎多次运行setup.py。因此,如果将导入放在文件之上,则构建将失败。
与@makeroo方法一样,另一种方法是将
这种方法的好处是可以肯定地获得生成结果。
1 2 3 4 5 6 7 | proto_files = ["proto/file1.proto","proto/file2.proto"] import subprocess for file in proto_files: args ="--proto_path=. --python_out=. --grpc_python_out=. {0}".format(file) result = subprocess.call("python -m grpc_tools.protoc" + args, shell=True) print("grpc generation result for '{0}': code {1}".format(file, result)) |
以上代码将在