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

时间:2018-10-25 17:21:27

标签: python setuptools grpc grpc-python

我们在回购中有一些gRPC的原始文件,我读到提交生成的代码不好。所以我认为我需要将这一代作为软件包安装的一部分(例如setuptools,setup.py)

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

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

2 个答案:

答案 0 :(得分:2)

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

  • 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()

注意在运行方法中导入 。在安装需求之前和之后,pip似乎多次运行setup.py。因此,如果将导入放在文件之上,则构建将失败。

答案 1 :(得分:1)

与@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))

以上代码将在proto文件所在的.proto目录中创建生成的python文件。