2015-12-25 51 views
23

我是新來的Python,我想了解一個問題,這是我在創建包時看到的。 我有以下文件結構:(工作目錄是/我/的Python/jmLib2)python3:ImportError:沒有名爲xxxx的模塊

/my/Python/jmLib2 
    |--- Phone 
    |  |--- __init__.py 
    |  |--- Pots.py 
    |- Test2.py 

--------------------------------- 
cat ./jmLib2/Pots.py 
#!/usr/bin/python 

def Pots(): 
    print ("I'm Pots Phone") 

--------------------------------- 
cat ./jmLib2/__init__.py 
from Pots import Pots 

--------------------------------- 
cat ./Test2.py 
#!/usr/bin/python 
from Phone import Pots 

import os.path 
print ("OS:"+str(os.path)) 

Pots() 

當我現在做的事:

python2 Test2.py 
OS:<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'> 
    I'm Pots Phone* 

偉大的...但是,如果我請執行以下操作:

python3 Test2.py 
Traceback (most recent call last): 
    File "Test2.py", line 2, in <module> 
    from Phone import Pots 
    File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module> 
    from Pots import Pots 
ImportError: No module named 'Pots' 

我正在Eclipse下使用PyDev。 PyDev在init .py文件中報告了一個「未解析的導入:Pots」 - 錯誤。 我在PyDev和bash下有相同的回溯問題。

再一次,我是Python新手......所以這可能是一個非常愚蠢的錯誤。 但有人可以解釋我,python2和python3.4之間的區別嗎? 我必須修改PYTHONPATH嗎?爲什麼?

問候 爾根

回答

33

TL; DR:Relative imports are gone。改用絕對導入。

要麼使用:

from Phone.Pots import Pots 

或:

from .Pots import Pots 

出現問題的原因PotsPhone包的一部分:沒有名爲Pots模塊,有一個名爲Phone.Pots模塊。

Python 2有一個名爲relative imports的功能,可以讓您編寫import Pots,即使這在技術上不正確。然而

相對進口的problems and confusion來源:

  • 誰讀碼不能馬上說是否進口是從一個包或沒有。
  • 模塊如何被命名爲Phone.Pots,但我可以使用import Pots?這是非常不一致的。
  • 如果子模塊會隱藏另一個模塊的名稱會怎麼樣?

出於這些原因,相對進口量從Python 3的去除


您可以通過使用一個__future__ import擺脫在Python 2相對進口:

from __future__ import absolute_import 
+0

安德烈:三江源快速而詳細的答案。 – MatrixClient

相關問題