# Python setuptools extension This is an extension for Python setuptools which uses an installed protobuf compiler (`protoc`) to generate Python sources. ## Installing To use this extension, it needs to be installed so it can be imported by other projects' setup.py. ```shell $ python setup.py build $ python -m pip install . ``` (If you want to test changes to the extension, you can use `python setup.py develop`.) ## Usage ### Example setup.py configuration ```python from setuptools import setup setup( # ... name='example_project', # Require this package, but only for setup (not installation): setup_requires=['protobuf_distutils'], options={ # See below for details. 'generate_py_protobufs': { 'source_dir': 'path/to/protos', 'extra_proto_paths': ['path/to/other/project/protos'], 'output_dir': 'path/to/project/sources', # default '.' 'proto_files': ['relative/path/to/just_this_file.proto'], 'protoc': 'path/to/protoc.exe', }, }, ) ``` ### Example build invocation These steps will generate protobuf sources so they are included when building and installing `example_project` (see above): ```shell $ python setup.py generate_py_protobufs $ python setup.py build $ python -m pip install . ``` ## Options - `source_dir`: This is the directory holding .proto files to be processed. The default behavior is to generate sources for all .proto files found under `source_dir`, recursively. This behavior can be controlled with options below. - `proto_root_path`: This is the root path for resolving imports in source .proto files. The default is the shortest prefix of `source_dir` among `[source_dir] + self.extra_proto_paths`. - `extra_proto_paths`: Specifies additional paths that should be used to find imports, in addition to `source_dir`. This option can be used to specify the path to other protobuf sources, which are imported by files under `source_dir`. No Python code will be generated for .proto files under `extra_proto_paths`. - `output_dir`: Specifies where generated code should be placed. Typically, this should be the root package that generated Python modules should be below. The generated files will be placed under `output_dir` according to the relative source paths under `proto_root_path`. For example, the source file `${proto_root_path}/subdir/message.proto` will be generated as the Python module `${output_dir}/subdir/message_pb2.py`. - `proto_files`: A list of strings, specific .proto file paths for generating code, instead of searching for all .proto files under `source_path`. These paths are relative to `source_dir`. For example, to generate code for just `${source_dir}/subdir/message.proto`, specify `['subdir/message.proto']`. - `protoc`: By default, the protoc binary (the Protobuf compiler) is found by searching the environment path. To use a specific protoc binary, its path can be specified. Resolution of the `protoc` value is as follows: 1. If the `--protoc=VALUE` flag is passed to `generate_py_protobufs`, then `VALUE` will be used. For example: ```shell $ python setup.py generate_py_protobufs --protoc=/path/to/protoc ``` 2. Otherwise, if a value was set in the `options`, it will be used. (See "Example setup.py configuration," above.) 3. Otherwise, if the `PROTOC` environment variable is set, it will be used. For example: For example: ```shell $ PROTOC=/path/to/protoc python setup.py generate_py_protobufs ``` 4. Otherwise, `$PATH` will be searched.