2015-06-17 130 views
5

看來,如果一個文件被稱爲io.py和它進口scipy.ndimage,後者不知何故最終沒能找到自己的子模塊,也稱爲ioPython和衝突的模塊名稱

$ echo "import scipy.ndimage" > io.py 
$ python io.py 
Traceback (most recent call last): 
    File "io.py", line 1, in <module> 
    import scipy.ndimage 
    File "/usr/lib/python2.7/dist-packages/scipy/__init__.py", line 70, in <module> 
    from numpy import show_config as show_numpy_config 
    File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 153, in <module> 
    from . import add_newdocs 
    File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module> 
    from numpy.lib import add_newdoc 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 22, in <module> 
    from .npyio import * 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 4, in <module> 
    from . import format 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module> 
    import io 
    File "/tmp/rm_me/io.py", line 1, in <module> 
    import scipy.ndimage 
    File "/usr/lib/python2.7/dist-packages/scipy/ndimage/__init__.py", line 172, in <module> 
    from .filters import * 
    File "/usr/lib/python2.7/dist-packages/scipy/ndimage/filters.py", line 37, in <module> 
    from scipy.misc import doccer 
    File "/usr/lib/python2.7/dist-packages/scipy/misc/__init__.py", line 45, in <module> 
    from .common import * 
    File "/usr/lib/python2.7/dist-packages/scipy/misc/common.py", line 10, in <module> 
    from numpy import exp, log, asarray, arange, newaxis, hstack, product, array, \ 
ImportError: cannot import name exp 

這是一個錯誤SciPy,還是我使用Python錯了?

更新:我想象的那麼令人驚訝的行爲是如果mod1解決路徑import mod2相對於mod1,而不是相對於任何人進口mod1

+1

這不是SciPy中的錯誤;這正是Python導入工作的方式。話雖如此,我不知道除了調用你的模塊別的什麼解決方法。 – jangler

+0

運行'python --version',看看你得到了什麼。 – user2357112

+0

@ user2357112 2.7.6(Ubuntu-14.04的本機) – MaxB

回答

3

您正在使用python錯誤。

在創建任何頂層python模塊或包之前,應該確保沒有該名稱的模塊或包。

這裏的最佳解決方案是不使用頂層模塊,而是將所有內容都放在一個頂級包(即具有__init__.py文件的目錄)中,並以項目命名。

要檢查頂層模塊或軟件包是否存在,您可以在解釋器中嘗試import或從shell運行pydoc name


值得注意的是,有一個非常類似的錯誤可能發生,是不是你的錯,如果程序包使用絕對式導入語法進行相對進口。這個「功能」在Python3中被刪除。

+0

如果後來添加的模塊/軟件包與您的(頂級)名稱衝突,那麼該怎麼辦? – JoshB

+0

@JoshB在這種情況下,你的所有依賴都不會導入你的名字。 – o11c

4

簡單的修復方法是避免命名模塊io,因爲它與核心庫模塊名稱衝突。

這不是真的numpy的一個bug,但用戶錯誤:正如因爲它陰影內置的list名字我們不應該使用list作爲變量名,我們不應該使用io作爲模塊名稱,因爲它的陰影中核心庫io模塊名稱。

請參見本部分:

File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module> 
    import io 

這裏numpy嘗試導入io module。這是爲了找到stdlib io,因爲絕對導入 - 一個numpy子模塊已經加載了相對導入,就像你可以在追溯中看到的那樣,那裏有另一行開頭from .npyio import *

當然,您自己的io.py模塊是首先找到的,因爲在當前工作目錄中一般是sys.path中的第一個條目。哎呦!