'How to generate and include GRPC code in a packaged module

I need to generate python grpc code from protobuf files and include them as a packaged module for my project. This is my setup.py

from setuptools import setup, find_namespace_packages
import os
import sys


def generate_grpc():
    from grpc_tools import protoc
    import pkg_resources
    inclusion_root = os.path.abspath("path-to-proto-files")
    output_root = os.path.abspath("path-output")
    proto_files = []
    for root, _, files in os.walk(inclusion_root):
        for filename in files:
            if filename.endswith('.proto'):
                proto_files.append(os.path.abspath(os.path.join(root,
                                                                filename)))
    well_known_protos_include = pkg_resources.resource_filename(
        'grpc_tools', '_proto')
    for proto_file in proto_files:
        command = [
                      'grpc_tools.protoc',
                      '--proto_path={}'.format(inclusion_root),
                      '--proto_path={}'.format(well_known_protos_include),
                      '--python_out={}'.format(output_root),
                      '--grpc_python_out={}'.format(output_root),
                  ] + [proto_file]
        if protoc.main(command) != 0:
            sys.stderr.write('warning: {} failed'.format(command))


class BuildPyCommand(build_py):
    def run(self):
        generate_grpc()
        build_py.run(self)


setup(cmdclass={
          'build_py': BuildPyCommand,
      },
      setup_requires=[
          'grpcio-tools',
      ],
      package_dir={'': 'src'},
      packages=find_namespace_packages(where='src')
      )

I run this and see that the generated files are not copied to the build directory and as a result are not available when packaged.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source