如何从 setuptools 安装程序 (setup.py) 中生成 python grpc 代码?
How do I generate python grpc code from within a setuptools installer (setup.py)?
我们在 repo 中有一些 gRPC 的原型文件,我读到提交生成的代码不好。所以我想我需要将生成作为包安装的一部分(例如 setuptools,setup.py)
但是要生成gRPC代码,需要先按照the docs运行pip install grpcio-tools
安装包。但是 setup.py 的目的是自动拉下像 grpcio-tools.
这样的依赖
那么,是否有执行此操作的最佳实践?比如,如何从 setuptools 中生成依赖于另一个 python 包的代码?我最好只创建一个单独的 build.sh
脚本来手动 pip 安装并生成代码吗?或者我应该期望软件包的用户已经安装了 grpcio-tools?
据我所知,"current"最佳实践是:
- pip 管理依赖关系
- 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()
注意 inside 运行 方法的导入。似乎 pip 运行 setup.py 好几次,在安装要求之前和之后。因此,如果您在文件顶部导入,构建将失败。
与@makeroo 方法一起,另一种方法是将 grpc_tools
模块作为子进程执行。
这种方式的好处是肯定能收到生成结果; 0
表示成功,1
表示错误。
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))
以上代码会将生成的 python 文件创建到 .proto
文件所在的 proto
目录。
我们在 repo 中有一些 gRPC 的原型文件,我读到提交生成的代码不好。所以我想我需要将生成作为包安装的一部分(例如 setuptools,setup.py)
但是要生成gRPC代码,需要先按照the docs运行pip install grpcio-tools
安装包。但是 setup.py 的目的是自动拉下像 grpcio-tools.
那么,是否有执行此操作的最佳实践?比如,如何从 setuptools 中生成依赖于另一个 python 包的代码?我最好只创建一个单独的 build.sh
脚本来手动 pip 安装并生成代码吗?或者我应该期望软件包的用户已经安装了 grpcio-tools?
据我所知,"current"最佳实践是:
- pip 管理依赖关系
- 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()
注意 inside 运行 方法的导入。似乎 pip 运行 setup.py 好几次,在安装要求之前和之后。因此,如果您在文件顶部导入,构建将失败。
与@makeroo 方法一起,另一种方法是将 grpc_tools
模块作为子进程执行。
这种方式的好处是肯定能收到生成结果; 0
表示成功,1
表示错误。
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))
以上代码会将生成的 python 文件创建到 .proto
文件所在的 proto
目录。