如何从 setuptools 安装程序 (setup.py) 中生成 python grpc 代码?

Tom*_*Tom 6 python setuptools grpc grpc-python

我们在一个 repo 中有一些 gRPC 的 proto 文件,我读到提交生成的代码并不好。所以我想我需要将生成作为包安装的一部分(例如 setuptools、setup.py)

但是,要生成 gRPC 代码,您需要先pip install grpcio-tools根据docs运行安装包。但是 setup.py 的目的是自动下拉依赖,比如grpcio-tools

那么是否有这样做的最佳实践?如在,如何从 setuptools 中生成依赖于另一个 python 包的代码?我最好创建一个单独的build.sh脚本来手动 pip-installs 并生成代码吗?或者我应该期望软件包的用户已经安装了grpcio-tools吗?

mak*_*roo 9

据我所知,“当前”的最佳实践是:

  • pip 管理依赖
  • setup.py 执行构建

执行“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'
        ])
Run Code Online (Sandbox Code Playgroud)

调用自定义 build_py 命令,如下所示:

class BuildPyCommand (build_py):
    def run(self):
        self.run_command('grpc')
        super(BuildPyCommand, self).run()
Run Code Online (Sandbox Code Playgroud)

注意导入内部的run方法。在安装需求之前和之后,pip 似乎多次运行 setup.py。因此,如果您在文件顶部进行导入,则构建将失败。