2014-04-08 9 views
5

Używam szablonu ustawionego przez współpracownika i jako początkujący pytona może brakować czegoś bardzo oczywistego.import względny z pliku __init__.py powoduje błąd rzutowania

Katalog główny zawiera plik init, który ma moduł potrzebny do głównego pliku pythona, który generuje błąd.

Współpracownikiem używane:

from . import X 

Gdzie X to moduł, ale podczas kopiowania tego (i zaludnione plik startowy) do własnego katalogu generuje ten błąd:

ValueError: Attempted relative import in non-package

Od google i TAK Zdaję sobie sprawę, że jest to całkowicie w porządku i logiczne, więc zastanawiam się, jako początkujący, co przegapiłem.

+0

możliwe duplikat [PRÓBA względnej importu w poza pakietem nawet z \ _ \ _ startowych \ _ \ _. Py] (http://stackoverflow.com/questions/11536764/attempted-relative-import-in-non- pakiet-nawet-z-init-PY) –

+0

W tej sugestii on ciągnąc ze standardowego pliku .py. Mój problem polega na wyciągnięciu z pliku __init__.py. – thewellis

+0

Ale twój problem ma tę samą przyczynę. Mam nadzieję, że moja odpowiedź wyjaśni przyczynę błędu. –

Odpowiedz

8

Musisz zrozumieć, w jaki sposób Python obsługuje moduły.

Po uruchomieniu interpretera za pomocą skryptu skrypt ten staje się modułem głównym o pasującej nazwie __main__.

Podczas korzystania z import w szukanej ścieżce wyszukiwane są inne moduły, do których można również uzyskać dostęp (i zmienić) za pomocą sys.path. Pierwszy wpis sys.path jest zwykle pusty i oznacza bieżący katalog.

Katalog w ścieżce wyszukiwania to pakiet, jeśli zawiera on plik __init__.py.

Teraz, podczas wykonywania skryptu w katalogu, który zawiera plik __init__.py skrypt ten będzie __main__ i katalog nie jest traktowane jako pakiet, ponieważ nie jest w sys.path!

Na przykład rozważmy następujący układ katalogów:

 
root/ 
    pkg/ 
     __init__.py 
     b.py 
     c.py 
    a.py 

Po uruchomieniu python a.py z katalogu root/ można importować pkg/ i korzystania importu względne w tym opakowaniu (np from . import c w b.py lub __init__.py).

Po uruchomieniu python b.py z katalogu pkg, nie można korzystać z importu względne ponieważ Python nie rozpoznaje pkg jako pakiet: to nie jest w sys.path. W przypadku Pythona pkg jest zwykłym katalogiem, bez względu na to, czy zawiera on __init__.py. Pełna nazwa c.py to tylko c, a nie pkg.c, więc względna from . import c nie będzie działać.

+1

Myślę, że rozumiem. Ponieważ użycie importu względnego jest lokalne dla folderu, wygeneruje błąd, ponieważ odwołanie jest okrężne. Co jest dziwne, że mój współpracownik używa tej taktyki w swoich skryptach. Większość z tego, co wygląda dość logiczne kodów i wodoszczelna, może on ma rozszerzenie Jenkins lub coś, analizuje je. – thewellis

Powiązane problemy