Mam pakiet p
, który ma moduły a
i b
. a
polega na b
:Moduł importu siły z bieżącego katalogu
b.py
treść:
import a
Jednak chcę zapewnić że b
importuje mój moduł a
z tego samego katalogu p
pakietu, a nie tylko dowolny moduł a
z PYTHONPATH
.
Więc próbuję zmienić b.py
jak następuje:
from . import a
Działa to tak długo, jak importować b
kiedy jestem poza p
katalogu pakietu. Biorąc pod uwagę następujące pliki:
/tmp
/p
a.py
b.py
__init__.py
następujące prace:
$ cd /tmp
$ echo 'import p.b' | python
Następujące nie działa:
$ cd /tmp/p
$ echo 'import b' | python
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "b.py", line 1, in <module>
from . import a
ValueError: Attempted relative import in non-package
Dlaczego?
P.S. Używam Python 2.7.3
nie stosuj niejawnych względnych importów (nie ma ich w Pythonie 3). Zawsze używaj bezwzględnego importu ('from p import a' (dodaj' from __future__ import absolute_import' przed nim, jeśli istnieje plik 'p/p.py')) lub jawnego względnego importu (' od. Import a' (jeśli nie jest moduł '__main__')). Nie uruchamiaj skryptów z katalogu paczek w Pythonie; to przedkłada ten katalog do sys.path, co może prowadzić do tego, że ten sam moduł jest dostępny pod różnymi nazwami, co prowadzi do błędów związanych ze stanem modułu (jeśli stosujesz niejawny import względny, a także cienie w tym przypadku inne moduły tweenvel). – jfs
Dobre notatki. Dzięki! –
Jeśli ponownie prześlesz odpowiedź jako odpowiedź, zaakceptuję ją. –