2012-02-14 53 views
16

多層次的相對進口多級相對進口

我有以下文件夾結構

top\ 
    __init__.py 
    util\ 
     __init__.py 
     utiltest.py 
    foo\ 
     __init__.py 
     foo.py 
     bar\ 
     __init__.py 
     foobar.py 

我想從foobar.py模塊utiltest.py訪問。我嘗試以下相對進口,但這並不工作: from ...util.utiltest import *

我總是 ValueError: Attempted relative import beyond toplevel package

如何做這樣的multileve相對進口?

+1

爲什麼相對導入?絕對導入應該是這樣做的最簡單的方法;):'from util.utiltest import *' – 2012-02-14 12:56:53

回答

12

必須從top父文件夾導入foobar

import top.foo.bar.foobar 

這告訴Python top是頂級包。相對導入只能在包內進行。

11

我意識到這是一個古老的問題,但我覺得接受的答案可能會錯過提問者代碼的主要問題。嚴格來說,這並沒有錯,但它提出了一個建議,即只有巧合的情況才能解決真正的問題。

真正的問題是top\foo\bar中的foobar.py文件正在作爲腳本運行。當嘗試(正確!)相對導入時,它會失敗,因爲Python解釋器不理解包結構。

這樣做的最好的解決辦法是通過文件名來運行foobar.py沒有,而是使用-m標誌來解釋,告訴它運行top.foo.bar.foobar模塊。通過這種方式,Python將知道它所加載的主要模塊位於一個包中,並且它將確切知道相對導入所指的位置。