2012-12-11 149 views
2

我很忙使用Python開發的應用程序,如下導入失敗,導入錯誤

main.py 
pr/ 
    core/ 
     __init__.py 
     predictor.py 
    gui/ 
     predictor/ 
      __init__.py 
      predict_panel.py 
     __init__.py 
     pr_app.py 
    __init__.py 

我的應用程序的結構我啓動使用main.py

在應用程序內pr_app.py我有

class PrApp(wx.App): 
    PREDICTOR = Predictor() 

predict_panel.py我可以做成功

from pr.core.predictor import Predictor

,但由於某種原因,我不能這樣做

from pr.gui.pr_app import PrApp

我得到帶有

ImportError: cannot import name PrApp

在Python從父目錄中導入時是否有某種疑難雜症的,還是我錯過了什麼?

+0

我認爲額外的信息是有幫助的。 @ erikb85 – Tyrick

回答

2

我試過這個,並製作了一個像你的樹,但在pr目錄中增加了一個__init__.py。沒有那__init__.py你的from pr.core.predictor import Predictor應該失敗,所以我認爲你有它,但忘了寫在你的問題。

我沒有得到你所做的失敗,它對我來說工作得很好。正如我所料,我可以從predict_panel.py這兩個進口。

但是,如果我從pr_app.py進口predict_panel,然後從PrApppredict_panel.py導入將失敗。這是因爲我有一個循環導入。您嘗試在導入PrApp期間從PrApp導入predict_panel,並且您在導入predict_panel期間嘗試導入PrApp。這將創建一個無限遞歸的進口,所以它是不允許的。

解決此問題的最佳方法是重新組織代碼,以便不必執行循環導入。如果PrApp進口predict_panel,爲什麼predict_panel需要PrApp?這是一個有缺陷的設計的標誌。

但是,解決這個問題的最快方法是將其中一個導入從模塊的頂部移動到被調用的函數/方法中。這是不好的做法,但它會很快解決您的問題。

+1

我已經改變佈局有點阻止循環導入和它的工作,我需要導入PrApp的原因是爲了訪問我在那裏定義的一個常量。我已經將常量移動到一個新的文件settings.py中,並且生活很好再次謝謝你。 – jmoggee

-1

無法從父目錄導入的原因是每個腳本都認爲自己是導入樹的頂部。其他唯一的東西是sys.path。所以據我所知,只有從以上導入的唯一機會是將父目錄添加到您的路徑(絕對不是相對的)。

在你的文件的頂部將這個:

import sys 
import os 
import inspect 

#enable imports from dir above 
sys.path.append(os.path.abspath(
    os.path.dirname(inspect.getfile(inspect.currentframe()))+"/..")) 
+1

爲什麼不只是'os.path.abspath(os.path.dirname(__ file__)+「/ ..」)' – Matthias

+0

不使用'__file__'會使你陷入[類似這樣的問題](https:// code .djangoproject.com/ticket/15631),因爲這個變量並不總是存在。 – erikbwork

+0

在我導入之前添加這個我可以看到父目錄被添加到'sys.path',雖然'from pr.gui.pr_app import PrApp'仍然產生相同的錯誤 – jmoggee

0

我使用main.py

通過這樣做,你正確地作出啓動該應用程序的文件夾pr/一個包,所以十字該包中的引用導入應該可以工作。所以pr.gui.pr_app import PrAppfrom ..pr_app import PrApp應該工作。

我認爲你的情況的問題是,你沒有使pr真正的包。嘗試在那裏添加__init__.py,它應該工作。

+0

然後'從pr.core.predictor import Predictor'也不應該工作,所以我認爲有一個'__init __。py',但他忘了打印它。 –

+0

我已經在__init__.py在公關,更新我的問題 – jmoggee

+0

Bleh :(但是,那麼它應該工作,修改導入路徑不應該是必要的。是__init __。py's空? – poke