2014-04-08 10 views
5

Quindi sto usando un modello impostato da un collega e come novizio in Python potrei mancare qualcosa di molto ovvio.l'importazione relativa dal file __init__.py genera l'errore

La directory principale ha il file init che ha un modulo necessario per il file python principale che genera l'errore.

Collaboratore usato:

from . import X 

Dove X è il modulo, ma quando la copia di questo (e un file di init popolato) alla mia propria directory genera questo errore:

ValueError: Attempted relative import in non-package

Da google e SO capisco che questo è perfettamente bene e logico quindi mi chiedo, come novellino, cosa mi è mancato.

+0

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) –

+0

In questo suggerimento sta tirando da un file .py standard. Il mio problema riguarda l'estrazione da un file __init__.py. – thewellis

+0

Ma il tuo problema ha la stessa causa. Spero che la mia risposta chiarisca la ragione del tuo errore. –

risposta

8

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à.

+1

Penso di aver capito. Poiché l'utilizzo dell'importazione relativa è locale in una cartella, genererà l'errore in quanto la referenziazione è di tipo circolare. Il che è strano che il mio collega utilizzi questa tattica in tutte le sue sceneggiature. La maggior parte di ciò che codifica appare abbastanza logico e a tenuta stagna, forse ha un'estensione Jenkins o qualcosa che la analizza. – thewellis