grpc
grpc copied to clipboard
Generated Python code protobuf version mismatch
What version of gRPC and what language are you using?
grpcio 1.73.0 Python package
What operating system (Linux, Windows,...) and version?
Linux 6.15.2
What runtime / compiler are you using (e.g. python version or version of gcc)
Python 3.13.3
What did you do?
- create
example.protofile:syntax = "proto3"; message MyMessage {} - create virtualenv and install packages
python -m venv .venv source .venv/bin/activate pip install 'grpcio-tools==1.73.0' 'protobuf==6.30.0' - generate pb2 file
python -m grpc_tools.protoc -I. --python_out . example.proto - try importing the generated module
python -m example_pb2
What did you expect to see?
I'd expect the import to pass.
What did you see instead?
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/home/jmusilek/git/mwe/example_pb2.py", line 12, in <module>
_runtime_version.ValidateProtobufRuntimeVersion(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
_runtime_version.Domain.PUBLIC,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...<4 lines>...
'example.proto'
^^^^^^^^^^^^^^^
)
^
File "/home/jmusilek/git/mwe/.direnv/python-3.13.3/lib/python3.13/site-packages/google/protobuf/runtime_version.py", line 113, in ValidateProtobufRuntimeVersion
_ReportVersionError(
~~~~~~~~~~~~~~~~~~~^
'Detected incompatible Protobuf Gencode/Runtime versions when loading'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
f' {location}: gencode {gen_version} runtime {version}. Runtime version'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
f' cannot be older than the linked gencode version. {error_prompt}'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/jmusilek/git/mwe/.direnv/python-3.13.3/lib/python3.13/site-packages/google/protobuf/runtime_version.py", line 50, in _ReportVersionError
raise VersionError(msg)
google.protobuf.runtime_version.VersionError: Detected incompatible Protobuf Gencode/Runtime versions when loading example.proto: gencode 6.31.0 runtime 6.30.0. Runtime version cannot be older than the linked gencode version. See Protobuf version guarantees at https://protobuf.dev/support/cross-version-runtime-guarantee.
Anything else we should know about your project / environment?
It turns out that grpcio-tools bundle their own version of protobuf and this version is higher than the minimal protobuf requirement in install_requires of grpcio-tools. This leads to an unexpected situation – the generated code has a minimum protobuf version requirement of 6.31.0, even when I have protobuf 6.30.0 installed. There is no indication from the grpcio-tools that I won't be able to import the generated modules with the currently installed version of protobuf.
I don't understand what is install_requires version of protobuf in grpcio-tools supposed to represent. It's definitely not the requirement for runtime protobuf version generated by grpcio-tools which is what I'd expect.
I did read the discussion in #37609, but I don't think the problem has been resolved at all. If you don't use monorepo and have all your gRPC APIs in separate Python packages, this is a huge pain, that should be resolved.
One solution I see is to always declare the bundled protobuf version as a minimal runtime version for grpcio-tools. This is a bare minimum and not really great by itself, because grpcio-tools is just a build dependency and there's no reason why it should be installed in the runtime environment. But still, it would at least give us some idea about the actual minimal required protobuf version of the generated code.