2017-02-28 56 views
3

我們有一個Python 2模塊,我們使用python setup.py sdist構建,然後部署到遠程計算機並使用pip install mymodule.tar.gz安裝在virtualenv中。AttributeError:'module'對象沒有屬性'__file__'(使用pip安裝模塊)

問題是:在一臺機器上,生成的模塊知道它自己的文件路徑__file__,而在另一臺機器上它不知道。測試用例是這樣的:

python -c "import mymodule; print(mymodule.__file__)"

在一臺機器它正確打印到的virtualenv「站點包」內的位置的完整路徑。在另一個非常類似的機器它提出:

AttributeError: 'module' object has no attribute '__file__'

(該問題的機器運行Ubuntu 14.04 AWS EC2節點)。

問題被視爲試圖解決使用pkg_resources才能通過的路徑時,做 python -c "import pkg_resources; print(pkg_resources.resource_filename('mymodule', 'migrations'))" - 這應該給模塊代碼的完整路徑,但不能在有問題的機器上正確解析。

我看不到在shell環境中,pip安裝的軟件包集合或pip安裝後的「mymodule」文件系統的差異。我已經cd編輯到一個空文件夾,以確保我沒有從cwd導入任何東西。

我可以調查哪些差異來追蹤此問題?我如何確保我的pip install安裝了知道其文件路徑的軟件包?

回答

0

問題的根源在於我們實際上是在安裝兩個模塊,而Python似乎有排序模糊。我們設計和安裝這兩個模塊作爲單獨的代碼庫:

mymodule 
mymodule.crazything 

換句話說,後者是一個獨立的包添加子模塊mymodule。這意味着當編譯後者時,它會創建一個沒有內容的虛擬mymodule

安裝這兩個軟件包時,會安裝兩個單獨的mymodule模塊。當您運行import mymodule時,哪一個將會被使用?據我所知,這是Python未定義的,它在本地一致,但在機器間不一致。

我們的解決方案是:不要在子模塊中創建單獨的包,而是給它們單獨的不衝突的模塊標識。

相關問題