Devi capire come Python gestisce i moduli.
Quando si avvia l'interprete con uno script, questo script diventa il modulo principale, con il nome corrispondente __main__
.
Quando si utilizza import
, gli altri moduli vengono ricercati nel percorso di ricerca, che è possibile accedere (e modificare) utilizzando sys.path
. La prima voce di sys.path
è in genere vuota e rappresenta la directory corrente.
Una directory all'interno del percorso di ricerca è un pacchetto se contiene un file __init__.py
.
Ora, quando si esegue uno script all'interno di una directory che contiene un file __init__.py
, questo script diventerà __main__
e la directory non viene considerato come un pacchetto, in quanto non è in sys.path
!
Ad esempio, si consideri il seguente schema di directory:
root/
pkg/
__init__.py
b.py
c.py
a.py
Quando si esegue python a.py
dalla directory root/
, è possibile importare pkg/
e utilizzare le importazioni relative all'interno di questo pacchetto (ad esempio, from . import c
in b.py
o __init__.py
).
Quando si esegue python b.py
dalla directory pkg
, non è possibile utilizzare le importazioni relative poiché Python non riconosce pkg
come un pacchetto: non è in sys.path
. Per Python, pkg
è una directory ordinaria, non importa se contiene uno __init__.py
. Il nome completo di c.py
è solo c
, non pkg.c
, pertanto un relativo from . import c
non funzionerà.
fonte
2014-04-08 21:49:12
possibile duplicato di [Tentativo importazione relativa in non-pacchetto anche con \ _ \ _ init \ _ \ _. Py] (http://stackoverflow.com/questions/11536764/attempted-relative-import-in-non- package-even-with-init-py) –
In questo suggerimento sta tirando da un file .py standard. Il mio problema riguarda l'estrazione da un file __init__.py. – thewellis
Ma il tuo problema ha la stessa causa. Spero che la mia risposta chiarisca la ragione del tuo errore. –