2013-03-04 75 views
7

我已經摔了大半夜試圖解決一個導入錯誤。Python不能導入名稱<class>

這是一個常見的問題,但沒有先前的問題相當回答我的問題。

我使用的PyDev(一個Eclipse插件),和庫Kivy(一個Python庫)

我有一個文件結構設置是這樣的:

<code> 
    __init__.py 
    main.py 
    engine.py 
    main_menu_widget.py 

「代碼」 舉行之內eclipse文件夾「MyProject」,但它不是一個包,所以我沒有包含它。

的文件看起來是這樣的:

main.py

# main.py 
from code.engine import Engine 

class MotionApp(App): 
    # Ommited 

engine.py

# engine.py 
from code.main_menu_widget import MainMenuWidget 

class Engine(): 
    # Ommited 

main_menu_widget.py

# main_menu_widget.py 
from code.engine import Engine 

class MainMenuWidget(Screen): 
    pass 

我收到的錯誤,在全部細節,是:

Traceback (most recent call last): 
    File "C:\MyProject\code\main.py", line 8, in <module> 
    from code.engine import Engine 
    File "C:\MyProject\code\engine.py", line 6, in <module> 
    from code.main_menu_widget import MainMenuWidget 
    File "C:\MyProject\code\main_menu_widget.py", line 3, in <module> 
    from code.engine import Engine 

任何想法我在這裏做錯了嗎?我只是改名爲我的整個文件夾結構,因爲我搞砸了這個模塊結構如此糟糕,但我想我靠近它應該是什麼樣子....

+3

可能重複[ImportError:Can not import name X](http://stackoverflow.com/questions/9252543/importerror-cannot-import-name-x) – 2016-05-18 16:32:57

回答

5

它在同一文件夾中,使用相對包名稱(這是一個很好的做法,這樣做反正):

from .engine import Engine 
+0

not code.engine?那會更有意義,因爲它都在根代碼包內? – MintyAnt 2013-03-04 03:21:13

+0

從您自己的項目中導入項目時,使用相對導入通常是一種很好的做法。 – 2013-03-04 03:22:41

+1

夠公平的。我只是試了一下,沒有運氣,它引發了同樣的錯誤,相同的路線。 「無法導入名稱引擎」 – MintyAnt 2013-03-04 03:23:21

1

你的代碼目錄包。確保它上面的目錄,即C:\MyProject根據錯誤消息判斷是否在您的PYTHONPATH中。

通過選擇您的項目並單擊鼠標右鍵打開上下文菜單,然後選擇屬性。選擇的PyDev - PYTHONPATH並從那裏源文件夾標籤。 檢查上面提到的目錄是否存在;如果不是,按添加源文件夾,從對話框中選擇並按確定

8

似乎有一個循環導入。 從engine.py要導入main_menu_widget而從main_menu_widget要導入engine

這顯然是不被允許蟒的圓形進口。

+1

Yay Python 2告訴你這個問題 – mafrosis 2017-03-07 19:28:08