2013-11-27 99 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發佈出來時,您將再次遇到問題。