2009-12-16 138 views
138

我不能爲我的生活得到python的相對進口工作。我已經創造了它不起作用一個簡單的例子:任何人都可以解釋python的相對導入嗎?

目錄結構:

/__init__.py 
/start.py 
/parent.py 
/sub/__init__.py 
/sub/relative.py 

/start.py只包含:import sub.relative

/sub/relative.py只包含from .. import parent

所有其他文件都是空白。

在執行命令行中執行以下操作:

$ cd/
$ python start.py 

我得到:

Traceback (most recent call last): 
    File "start.py", line 1, in <module> 
    import sub.relative 
    File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module> 
    from .. import parent 
ValueError: Attempted relative import beyond toplevel package 

我使用Python 2.6。爲什麼會這樣?我如何使這個沙箱的例子工作?

回答

117

您正在從包「sub」導入。即使存在__init__.pystart.py本身也不在包裝中。

您將需要從一個目錄在parent.py啓動程序:

./start.py 

./pkg/__init__.py 
./pkg/parent.py 
./pkg/sub/__init__.py 
./pkg/sub/relative.py 

隨着start.py

import pkg.sub.relative 

現在PKG是頂層包,你的相對進口應該工作。


如果你想堅持你目前的佈局,你可以使用import parent。由於您使用start.py來啓動您的解釋器,因此start.py所在的目錄位於您的Python路徑中。 parent.py住在那裏作爲一個單獨的模塊。

如果您沒有將任何內容導入到目錄樹的更深處的腳本中,您還可以安全地刪除頂層__init__.py

+2

您在混淆術語'模塊'和'包'。 'start.py'表示模塊'start','mod'和'mod.sub'是包,'mod'是一個頂層包。 – 2009-12-16 23:45:37

+19

謝謝,但這真的看起來真的很愚蠢。對於這樣一種美麗的語言,我不敢相信設計師會創造這樣的限制。沒有其他方法嗎? – carl 2009-12-16 23:48:16

+2

這並不愚蠢。相對導入是指包中的兄弟模塊的意思。如果要導入頂層模塊,請使用絕對導入。 – 2009-12-17 15:30:08

15

如果您打算直接撥打relative.py,即如果您確實想從頂級模塊導入,則必須將其明確添加到sys.path列表中。
這裏是它如何工作:

# Add this line to the beginning of relative.py file 
import sys 
sys.path.append('..') 

# Now you can do imports from one directory top cause it is in the sys.path 
import parent 

# And even like this: 
from parent import Parent 

如果你覺得上面可能會導致某種不一致的,你可以使用它代替:

sys.path.append(sys.path[0] + "/..") 

sys.path[0]指入口點是路徑跑了。

相關問題