2013-03-22 15 views
5

Mam pakiet nadrzędny, który ma 2 pakiety podrzędne. To wygląda takNie można importować modułów pakietów nadrzędnych w pakietach podrzędnych.

backend 
    __init__.py 
    conf.py 
    db.py 
    connections.py 
    /api 
     __init__.py 
     register.py 
     api.py 
    /scheduled 
     __init__.py 
     helpers.py 

All the __init__.py files are empty.

Kod w backend/connections.py i backend/conf.py jest używany przez moduły w obu pakietach api i scheduled.

w register.py mam kod jak

from backend.conf import * 
from backend.connections import * 

Teraz kiedy robię python register.py ja dostać ten błąd

ImportError: No module named backend.conf 

Również kiedy zmienił from backend.conf import * do from ..conf import * lub from .. import conf ja dostać ten błąd

ValueError: Attempted relative import in non-package 

Rozumiem przez powyższy błąd, że Python nie traktuje powyższych folderów jako pakietów. Ale mam __init__.py we wszystkich folderach. Co jest nie tak?

+0

@MrE dlaczego 'connections' nie jest modułem? wszystkie pliki '__init __. py' są puste. – lovesh

Odpowiedz

5

Po uruchomieniu python register.py, plik backend/register.py służy jako moduł programu __main__, raczej niż jako moduł w opakowaniu backend. Co więcej, ścieżka importu Pythona nie będzie automatycznie zawierać katalogu zawierającego katalog backend, co prawdopodobnie jest przyczyną problemów.

Jedną z opcji, która może działać, jest uruchomienie programu pod numerem python -m backend.register z katalogu najwyższego poziomu projektu (lub ustawienia PYTHONPATH, aby moduł ten mógł zostać znaleziony). Spowoduje to wyszukanie skryptu na normalnej ścieżce importu, a następnie uruchomienie go jako programu głównego.

+0

@lovesh: W skrócie, nie możesz umieścić modułu głównego w podpakietie. – martineau

+0

Jak już powiedziałem w mojej odpowiedzi, możesz, jeśli uruchomisz swój program z 'python -m'. –

+0

Dokładnie - dobry powód, żeby go nie wypróbować - może powinienem był powiedzieć "... nie możesz umieścić głównego modułu w podpakietie". – martineau

Powiązane problemy