2016-12-29 52 views
2

背景

我做的__file__屬性從docs (scroll down to 'modules')是如何工作的一些研究,以及各種網站。進口第三方模塊沒有__file__屬性

據我所知,所有的python模塊只要從文件中加載就應該具有__file__屬性。

我使用

(env)$ pip install opencafe 

安裝第三方Python模塊opencafe我利用這種測試框架的問題。

從CLI運行測試命令時會出現此問題。當該命令運行時,它會觸發此文件:env/lib/python2.7/site-packages/cafe/configurator/managers.py

在這一文件中,有

import cafe 

,後來

_PLUGIN_DIR = os.path.join(os.path.dirname(cafe.__file__), 'plugins') 

當這個文件運行時,會出現此錯誤:

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

在這種情況下發生同樣的錯誤:

(env) $ pip install opencafe 
Collecting opencafe 
    Using cached opencafe-0.3.1-py2.py3-none-any.whl 
Installing collected packages: opencafe 
Successfully installed opencafe-0.3.1 
(env) $ python 
Python 2.7.10 (default, Jul 30 2016, 18:31:42) 
>>> import cafe 
>>> cafe.__file__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute '__file__' 

我的思想

我的自然傾向是隻認爲這是一個問題與opencafe本身,因爲我只安裝了框架和運行從CLI測試命令。

但是,我想知道安裝到虛擬環境或PYTHONPATH中是否存在問題。

該文檔明確指出:「對於靜態鏈接到解釋器的C模塊,__file__屬性不存在」。這個模塊是一個本地安裝的python模塊。它沒有鏈接到像sys模塊這樣的解釋器。

[編輯]

這裏是關於命名空間的包一些更多的好信息。

http://chimera.labs.oreilly.com/books/1230000000393/ch10.html#_discussion_172

如果包作爲一個命名空間包檢查其__file__的屬性,你可以告訴的主要途徑。如果完全缺失,該包是一個命名空間。

最後更新

事實證明,opencafe不與virtualenv最新版本。它只適用於版本15.0.1或更早版本。恢復回去擺脫了這個錯誤消息對我來說。

安裝此版本時,在virtualenv的軟件包中創建了一個__init__.pyc文件。這個字節編譯是如何得到它的信息__file__

回答

1

這是一個名稱空間包,它是一種奇怪的包,可以跨多個目錄拆分。由於這種分裂機制,它不應該有__file__

+0

既然如此,你會說這個問題確實與opencafe本身有關,因爲它在其自己的模塊之一中調用cafe .__ file__。除了每次安裝操作該行外,是否還有其他解決方法? – gliemezis

+0

@gliemezis:它呢?奇怪的。我不認爲它應該這樣做。 – user2357112

+0

是的[在這裏](https://github.com/openstack/opencafe/blob/master/cafe/configurator/managers.py#L613)。我同意這很奇怪。這不是最近的變化,但現在對我造成這個錯誤。 – gliemezis

4

這是因爲opencafe不是一個正常的python模塊。當你打開他們的主模塊__init__時,你可以很容易地看到它。

declare_namespace明確創建了一個namespace包。欲瞭解更多關於此的信息,你可以訪問PEP-382

+0

謝謝。我不熟悉命名空間包。既然如此,你會說這個問題確實與opencafe本身有關,因爲它在其自己的模塊中調用了「cafe .__ file__」。除了每次安裝操作該行外,是否還有其他解決方法? – gliemezis

+0

請注意,PEP 382被拒絕。 – user2357112

+1

但[PEP 420](https://www.python.org/dev/peps/pep-0420/)不是。 – gliemezis

相關問題