| # Protocol Buffers Python |
| |
| This directory contains the Protobuf library for Python. |
| |
| For user documentation about how to use Protobuf Python, see |
| https://protobuf.dev/getting-started/pythontutorial/ |
| |
| # Installation |
| |
| In most cases you should install the library using `pip` or another package |
| manager: |
| |
| ``` |
| $ pip install protobuf |
| ``` |
| |
| The packages released on https://pypi.org/project/protobuf/#files include both a |
| source distribution and binary wheels. |
| |
| ## Building packages from this repo |
| |
| If for some reason you wish to build the packages directly from this repo, you |
| can use the following Bazel commands: |
| |
| ``` |
| $ bazel build //python/dist:source_wheel |
| $ bazel build //python/dist:binary_wheel |
| ``` |
| |
| The binary wheel will build against whatever version of Python is installed on |
| your system. The source package is always the same and does not depend on a |
| local version of Python. |
| |
| ## Building from `setup.py` |
| |
| We support building from `setup.py`, but only from a Python source package. |
| You cannot build from `setup.py` using the GitHub repo or the GitHub source |
| tarball. |
| |
| To build a source package from this repo, see the instructions in the previous |
| section. |
| |
| # Implementation backends |
| |
| There are three separate implementations of Python Protobuf. All of them offer |
| the same API and are thus functionally the same, though they have very different |
| performance characteristics. |
| |
| The runtime library contains a switching layer that can choose between these |
| backends at runtime. Normally it will choose between them automatically, using |
| priority-ordered list, and skipping any backends that are not available. However |
| you can request a specific backend by setting the |
| `PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION` environment variable to one of the |
| following values: |
| |
| 1. **upb**: Built on the |
| [upb C library](https://github.com/protocolbuffers/protobuf/tree/main/upb), |
| this is a new extension module |
| [released in 4.21.0](https://protobuf.dev/news/2022-05-06/). It offers |
| better performance than any of the previous backends, and it is now the |
| default. It is distributed in our PyPI packages, and requires no special |
| installation. The code for this module lives in this directory. |
| 1. **cpp**: This extension module wraps the C++ protobuf library. It is |
| deprecated and is no longer released in our PyPI packages, however it is |
| still used in some legacy cases where apps want to perform zero-copy message |
| sharing between Python and C++. It must be installed separately before it |
| can be used. The code for this module lives in |
| [google/protobuf/pyext](https://github.com/protocolbuffers/protobuf/tree/main/python/google/protobuf/pyext). |
| 1. **python**: The pure-Python backend, this does not require any extension |
| module to be present on the system. The code for the pure-Python backend |
| lives in [google/protobuf/internal](google/protobuf/internal) |
| |
| The order given above is the general priority order, with `upb` being preferred |
| the most and the `python` backend preferred the least. However this ordering can |
| be overridden by the presence of a |
| `google.protobuf.internal._api_implementation` module. See the logic in |
| [api_implementation.py](https://github.com/protocolbuffers/protobuf/blob/main/python/google/protobuf/internal/api_implementation.py) |
| for details. |
| |
| You can check which backend you are using with the following snippet: |
| |
| ``` |
| $ python |
| Python 3.10.9 (main, Dec 7 2022, 13:47:07) [GCC 12.2.0] on linux |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> from google.protobuf.internal import api_implementation |
| >>> print(api_implementation.Type()) |
| upb |
| ``` |
| |
| This is not an officially-supported or stable API, but it is useful for ad hoc |
| diagnostics. |
| |
| More information about sharing messages between Python and C++ is available |
| here: https://protobuf.dev/reference/python/python-generated/#sharing-messages |
| |
| # Code generator |
| |
| The code for the Protobuf Python code generator lives in |
| [//src/google/protobuf/compiler/python](https://github.com/protocolbuffers/protobuf/tree/main/src/google/protobuf/compiler/python). |
| The code generator can output two different files for each proto `foo.proto`: |
| |
| * **foo_pb2.py**: The module you import to actually use the protos. |
| * **foo_pb2.pyi**: A stub file that describes the interface of the protos. |
| |
| The `foo_pb2.pyi` file is useful for IDEs or for users who want to read the |
| output file. The `foo_pb2.py` file is optimized for fast loading and is not |
| readable at all. |
| |
| Note that the pyi file is only generated if you pass the `pyi_out` option to |
| `protoc`: |
| |
| ``` |
| $ protoc --python_out=pyi_out:output_dir |
| ``` |