如何处理不同版本的 Python Protobuf?

4

我的Python包含许多由python-protobuf编译的文件(在Arch Linux上是python2-protobuf-2.5.0),我在Ubuntu服务器12.04.3上安装了该软件包(其中包含python-protobuf-2.4.1),尝试运行代码,结果出现以下错误:

from google.protobuf.internal import enum_type_wrapper
ImportError: cannot import name enum_type_wrapper

我认为问题出在我的软件包中的 protobuf 模块是由 protobuf-2.5.0 编译的,因此无法与 protobuf-2.4.1 兼容。
我不知道我的代码可能在哪些环境中运行,protobuf 的版本可能会有所不同。如何使我的软件包同时兼容 protobuf 2.4 和 2.5?
(一种可能的方法:在我的软件包中包含两个不同版本的 protobuf 库(一个由 2.4.1 编译,另一个由 2.5.0 编译),在运行时获取 google.protobuf 版本并选择要导入的 protobuf 库。这种方法可行吗?)
2个回答

3
您需要在 setup.py 的列表 install_requires=['protobuf>=2.5.0'] 中指定 protobuf 版本。对于 Python 包,您可以只使用名称或使用 == 指定确切的版本。我相信您也可以使用 != 指定特定版本。
如果您没有使用 setup.py 打包,您应该设置一个虚拟环境,并在项目的根目录中放置一个名为 install_requires.txt 的文件,其中包含所有特定的 Python 包和版本。
这可能看起来像:
$ cd ../project
$ virtualenv project_venv
$ source project_venv/bin/activate
$ cd project
$ pip install protobuf>=2.5.0
$ pip freeze > ./requirements.txt

然后,你可以将软件包分享给他人,他们可以激活其虚拟环境并运行以下命令:
$ pip install -r requirements.txt
请确保你的软件包在新建立的虚拟环境中能够正常工作。在使用sudo python setup.py install或在虚拟环境上下文中使用python setup.py install进行安装之前,这也是一个好的检查方式。你需要确保你的依赖关系可以让任何人都可以通过这种方法顺利地工作。
你可以使用以下命令退出虚拟环境的上下文:
$ deactivate

1
你最好的选择可能是在你的包中包含protobuf运行库的副本,也许使用不同的包名称。然后你可以确保它与你生成的代码的版本匹配。
另一个选项是将protoc作为安装过程的一部分调用,这样你就可以得到主机上可用的任何版本。
我认为打包多个版本的生成代码并不是一个好主意--当下一个protobuf版本发布时,你会再次遇到问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接