[英]How to exclude a single file from package with setuptools and setup.py
[英]How do I generate python grpc code from within a setuptools installer (setup.py)?
我们在一个 repo 中有一些 gRPC 的 proto 文件,我读到提交生成的代码并不好。 所以我想我需要将生成作为包安装的一部分(例如 setuptools、setup.py)
但是,要生成 gRPC 代码,您需要首先根据文档通过运行pip install grpcio-tools
来安装包。 但是 setup.py 的目的是自动下拉依赖,比如grpcio-tools 。
那么是否有这样做的最佳实践? 比如,如何从 setuptools 中生成依赖于另一个 python 包的代码? 我最好创建一个单独的build.sh
脚本来手动 pip-installs 并生成代码吗? 或者我应该期望软件包的用户已经安装了grpcio-tools ?
据我所知,“当前”最佳实践是:
执行“pip install”。 几乎相当于执行“pip install -r requirements.txt”+“python setup.py build”+“python setup.py install”。
这是一个从 proto 文件生成 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。 因此,如果您在文件顶部进行导入,则构建将失败。
与@makeroo 方法一起,另一种方法是将grpc_tools
模块作为子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
目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.