2013-06-28 92 views
0

我不明白爲什麼Python在這種情況下引發異常。我嘗試從全局安裝的導入,同時存在與包名稱具有相同前綴的文件。我錯過了什麼?意外的導入錯誤

$ touch fabric.py 
$ python2 
... 
>>> from fabric.api import run 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named api 

回答

0

從Python文檔:

該名稱將在導入搜索的各個階段中使用,並且它可能是一個子模塊,例如虛線路徑foo.bar.baz。在這種情況下,Python首先嚐試導入foo,然後foo.bar,最後導入foo.bar.baz。如果任何中間導入失敗,則會引發ModuleNotFoundError。

所以,import fabric.api嘗試加載fabric.py第一和成功,因爲它找到你fabric.py文件。接下來,它會嘗試加載api它剛加載的內容,但不起作用。

所以你的fabric.py是陰影fabric全球包。

更多細節在這裏:http://docs.python.org/dev/reference/import.html

+0

它不是「import fabric」,它的「import fabric.api」暗示層次結構 – planetp

+0

@planetp我編輯了我的答案,並試圖使它更完整:) – Guillaume

+0

我想我開始明白了。最難的部分是忘記我的Perl背景:) – planetp

0

Python有位置的路徑來尋找模塊:sys.path

['', ..., '/usr/lib/python2.7/site-packages/rsa-3.1.1-py2.7.egg', ..., 
'/usr/lib/python2.7/site-packages', ...] 

它搜索從左至右匹配模塊。

所以它首先找到本地模塊。 這沒有任何屬性api

如果導入本地模塊並將site-packages子模塊作爲其子模塊導入,則不明顯。

+0

所以'module.submodule'可以是一個具有屬性或包的模塊? – planetp