2013-03-04 9 views
7

Przez większość nocy starałem się rozwiązać problem z importem.Python nie może zaimportować nazwy <class>

Jest to typowy problem, ale żadne poprzednie pytanie nie jest odpowiedzią na mój problem.

Używam PyDev (plugin Eclipse), a biblioteka Kivy (biblioteka Pythona)

Mam strukturę plików skonfigurować tak:

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

"code" odbywa się w terminie folder eclipse "MyProject", ale nie jest to pakiet, więc go nie uwzględniłem.

Pliki wyglądać następująco:

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 

Błąd I odbieranie, w pełny szczegół, jest:

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 

Jakiś pomysł, co zrobiłem źle tutaj? Właśnie zmieniłem nazwę całej struktury folderów, ponieważ przykręciłem tę strukturę modułów tak źle, ale myślę, że jestem blisko tego, jak powinien wyglądać ...

+3

Możliwy duplikat [ImportError: Nie można zaimportować nazwy X] (http://stackoverflow.com/questions/9252543/importerror-cannot-import-name-x) –

Odpowiedz

5

jest w tym samym folderze, użyj względnej nazwy pakietu (to jest dobra praktyka, aby zrobić tak i tak):

from .engine import Engine 
+0

nie code.engine? Czy nie ma to większego sensu, skoro wszystko to znajduje się wewnątrz głównego pakietu "kodu"? – MintyAnt

+0

Zwykle dobrą praktyką jest stosowanie względnych importów podczas importowania rzeczy z własnego projektu. –

+1

Uczciwie.Po prostu spróbowałem, bez powodzenia, rzuca ten sam błąd, tę samą linię. "nie można zaimportować nazwy silnika" – MintyAnt

1

Twój katalog kod jest pakiet. Upewnij się, że katalog nad nim, tj. C:\MyProject sądząc po komunikatach o błędach, znajduje się w Twojej PYTHONPATH.

Otwórz menu kontekstowe, wybierając projekt i klikając prawym przyciskiem myszy, a następnie wybierz opcję Właściwości. Wybierz PyDev - PYTHONPATH, a stamtąd Karta Foldery źródłowe. Sprawdź, czy istnieje katalog wymieniony powyżej; jeśli to nie jest naciśnij Dodaj folder źródłowy, wybierz go z dialogu i naciśnij OK.

8

Wygląda na to, że mamy do czynienia z okrężnym importem. od engine.py importujesz main_menu_widget, a od main_menu_widget importujesz engine.

To jest oczywiście okrężny import, który nie jest dozwolony przez Pythona.

+1

Yay Python 2 informujący o problemie – mafrosis