跨平台gRPC Python开发工具版本冲突问题求解
我正在开发一个运行在树莓派上的gRPC服务,一开始在树莓派上完成了基础示例的构建和运行。为了节省时间,转到PC上的Linux Mint虚拟机开发,过程很顺利。
所有环境我都用标准方式,通过apt-get install python3-grpcio python3-grpc-tools安装系统维护的gRPC工具,避免用Python venv这类复杂方法。
但把生成的代码移回树莓派时出了问题,原因是代码由新版本gRPC工具生成,甚至在运行Raspbian 12 Bookworm和13 Trixie的Pi4之间迁移也有问题:
- 在旧Pi运行
server.py时报错:
ImportError: cannot import name 'runtime_version' from 'google.protobuf'
- 在新Pi执行编译命令时报错:
$ python -m grpc_tools.protoc -I. --python_out=. --pyi_out=. --grpc_python_out=. ./my.proto protoc-gen-pyi: program not found or is not executable --pyi_out: protoc-gen-pyi: Plugin failed with status code 1.
移除--pyi_out标志后看似解决,但不确定这种方式是否合规。
我没想到gRPC号称跨兼容,却因工具版本差导致代码无法构建/运行。我的目标是让服务原生运行在树莓派且依赖尽可能少,求最佳解决方案。
各环境版本参考:
Pi4(Bookworm)
$ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 12 (bookworm)" $ pip show grpcio Name: grpcio Version: 1.51.1 $ pip show grpcio-tools Name: grpcio-tools Version: 1.14.1 $ pip show protobuf Name: protobuf Version: 4.21.12
Pi4(Trixie)
$ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 13 (trixie)" $ pip show grpcio Name: grpcio Version: 1.51.1 $ pip show grpcio-tools Name: grpcio-tools Version: 1.14.1 $ pip show protobuf Name: protobuf Version: 4.21.12
x86虚拟机(Linux Mint)
$ cat /etc/issue Linux Mint 20.2 Uma $ pip show grpcio Name: grpcio Version: 1.68.0 $ pip show grpcio-tools Name: grpcio-tools Version: 1.68.0 $ pip show protobuf Name: protobuf Version: 5.28.3
1. 直接在树莓派编译(最稳妥)
既然最终服务要在树莓派运行,直接在目标Pi环境里编译.proto文件,彻底避免跨版本生成代码的兼容性问题。你用的是系统包管理的gRPC工具,树莓派上的版本虽然老旧,但能保证生成的代码和运行环境完全匹配,稳定性拉满。
2. 移除--pyi_out完全合规
--pyi_out是用来生成Python类型提示文件(.pyi)的可选参数,不是gRPC服务运行的必要条件。树莓派上的旧版本grpcio-tools不支持这个特性,所以移除后不会影响核心功能,只是少了类型提示文件而已。如果需要类型提示,可以后续手动补充,或者升级树莓派的gRPC工具。
3. 统一PC和树莓派的gRPC版本(适合跨环境开发)
如果坚持要在PC虚拟机开发,强制让PC上的依赖版本和树莓派对齐:
- 先卸载Linux Mint上的系统包:
sudo apt remove python3-grpcio python3-grpc-tools - 用pip安装和树莓派完全相同的版本:
pip install grpcio==1.51.1 grpcio-tools==1.51.1 protobuf==4.21.12
这样生成的代码就能直接在树莓派上运行,不会出现版本不兼容的报错。
4. 树莓派上升级gRPC工具(可选,追求新特性)
如果想在树莓派上使用--pyi_out这类新功能,可以卸载系统包后用pip安装新版本:
sudo apt remove python3-grpcio python3-grpc-tools pip install grpcio==1.68.0 grpcio-tools==1.68.0 protobuf==5.28.3
注意:这种方式会脱离系统包管理,后续系统更新可能出现依赖冲突,需要自己维护版本,但能获得最新功能。
总结
追求最小依赖和稳定性的话,优先选直接在树莓派编译或者统一PC和树莓派的gRPC版本;如果只是临时解决问题,移除--pyi_out完全没问题,不影响服务正常运行。
内容的提问来源于stack exchange,提问作者John U

