我的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库。有可能吗?
答案 0 :(得分:3)
您需要在列表setup.py
的{{1}}中指定将使用的protobuf版本。使用Python包,您可以使用install_requires=['protobuf>=2.5.0']
只放置将使用包运行的名称或确切版本。我相信您也可以为特定版本指定==
。
如果你没有用!=
打包它,你应该设置一个virtualenv并将一个文件setup.py
与项目根目录中的所有特定python包和版本放在一起。
这可能看起来像:
install_requires.txt
然后你分发的某个人可以激活他们的virtualenv并做:
$ cd ../project
$ virtualenv project_venv
$ source project_venv/bin/activate
$ cd project
$ pip install protobuf>=2.5.0
$ pip freeze > ./requirements.txt
通过使用该方法安装,确保您的软件包可以使用全新的virtualenv。在通过setup.py进行安装之前,这也很好检查。您希望确保您的要求能让任何工作人员在虚拟环境中完成新的$ pip install -r requirements.txt
或sudo python setup.py install
。
您可以使用以下命令退出virtualenv上下文:
python setup.py install
答案 1 :(得分:1)
您最好的选择可能是在您的软件包中包含protobuf运行时库的副本,可能使用不同的软件包名称。然后,您可以确保它与生成的代码的版本匹配。
另一个选择是在安装过程中调用protoc
,以便获得主机上可用的任何版本。
我认为打包生成的代码的多个版本听起来不是一个好主意 - 当下一个protobuf发布时,你只会再遇到问题。