2013-11-27 66 views
4

我的python软件包包含很多由python-protobuf(Arch Linux上的python2-protobuf-2.5.0)编译的文件,我在Ubuntu服务器12.04.3上安装了软件包蟒蛇-protobuf的-2.4.1),试运行代码,并击中了以下错误:如何处理python protobuf的不同版本

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库。是否有可能?

回答

3

您需要指定将在setup.py列表install_requires=['protobuf>=2.5.0']中使用的protobuf的版本。使用Python软件包,您可以使用==来放置与软件包一起运行的名称或准确版本。我相信你也可以为特定版本指定!=

如果你不打包一个setup.py,你应该设置一个virtualenv,并把一个文件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 

然后有人在分发到可以激活他们的virtualenv做:

$ pip install -r requirements.txt

确保你的包会从一个全新的virtualenv与安装工作该方法。在通过setup.py安装之前,这也是很好的检查。您希望确保您的要求能让任何在虚拟环境中执行新的sudo python setup.py installpython setup.py install的人员工作。

您可以退出了的virtualenv背景:

$ deactivate 
0

最好的办法可能是在你的软件包中包含一个protobuf运行时库的副本,或许包含不同的软件包名称,然后你可以确保它与你生成的代码的版本相匹配

另一种选择是调用protoc作为安装过程的一部分,因此您可以获得主机上可用的任何版本。

我不认为打包生成的代码的多个版本听起来像是一个好主意 - 当下一个protobuf发布出来时,您将再次遇到问题。