多库依赖不同版本Protobuf引发冲突的解决方法咨询
问题重现
ERROR: pip的依赖解析器目前未考虑所有已安装的包,此行为导致以下依赖冲突:
google-api-core 2.11.0 要求 protobuf!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.19.5,但您安装的是不兼容的protobuf 3.19.0。
google-cloud-firestore 2.11.1 要求 protobuf!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.19.5,但您安装的是不兼容的protobuf 3.19.0。
google-cloud-speech 2.19.0 要求 protobuf!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.19.5,但您安装的是不兼容的protobuf 3.19.0。
googleapis-common-protos 1.59.0 要求 protobuf!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.19.5,但您安装的是不兼容的protobuf 3.19.0。
grpcio-status 1.53.0 要求 protobuf>=4.21.6,但您安装的是不兼容的protobuf 3.19.0。
onnx 1.14.0 要求 protobuf>=3.20.2,但您安装的是不兼容的protobuf 3.19.0。
tensorflow-datasets 4.9.2 要求 protobuf>=3.20,但您安装的是不兼容的protobuf 3.19.0。
tensorflow-metadata 1.13.1 要求 protobuf<5,>=3.20.3,但您安装的是不兼容的protobuf 3.19.0。
解决步骤
1. 彻底清理现有protobuf
先完全卸载当前低版本protobuf,避免残留引发冲突:
pip uninstall -y protobuf
如果卸载后仍有残留,手动进入虚拟环境的lib/pythonX.X/site-packages目录,删除所有以protobuf或google.protobuf开头的文件夹和文件。
2. 安装兼容所有库的protobuf版本
根据所有冲突库的版本要求,唯一兼容的区间是 protobuf >=4.21.6 且 <5.0.0dev,直接指定该区间内的稳定版本安装:
pip install protobuf==4.21.6
也可以选择更高的4.x稳定版(如4.22.3、4.23.4),只要不超过5.0.0dev即可。
3. 升级所有冲突库适配新protobuf
强制升级所有依赖库,让pip自动选择适配当前protobuf版本的库版本:
pip install --upgrade google-api-core google-cloud-firestore google-cloud-speech googleapis-common-protos grpcio-status onnx tensorflow-datasets tensorflow-metadata
4. 用约束文件锁定版本(可选)
如果上述步骤仍有问题,创建约束文件constraints.txt,内容如下:
protobuf>=4.21.6,<5.0.0dev
然后通过约束文件安装/升级依赖,确保所有库都遵守protobuf版本规则:
pip install --constraint constraints.txt --upgrade [你的项目所有依赖包]
5. 降级冲突库(极端情况)
如果个别库无法适配高版本protobuf,查询该库的历史版本,找到支持protobuf>=4.21.6的版本手动安装:
# 示例:若google-api-core 2.11.0不兼容,安装兼容版本 pip install google-api-core==2.15.0
内容的提问来源于stack exchange,提问作者Qiblatain Fatima

