2013-01-08 18 views
13

Ho il pacchetto p che ha moduli a e b. a si basa su b:Forza importazione modulo dalla directory corrente

b.py contenuti:

import a 

Tuttavia voglio assicurare che b importa il mio modulo a dalla stessa directory p pacchetto e non solo qualsiasi modulo a da PYTHONPATH.

Così sto cercando di cambiare b.py come la seguente:

from . import a 

Questo funziona finchè ho importare b quando sono al di fuori del p directory del pacchetto. Dati i seguenti file:

/tmp 
    /p 
     a.py 
     b.py 
     __init__.py 

le seguenti opere:

$ cd /tmp 
$ echo 'import p.b' | python 

Il seguente non funziona:

$ 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 

Perché?

P.S. Sto usando Python 2.7.3

risposta

5

dopo aver riletto il Python import documentation, la risposta corretta al mio problema originale è:

Per assicurarti b importazioni a dalla sua confezione la sua quanto basta per scrivere quanto segue nella b:

import a 

Ecco la citazione dalla documentazione:

The submodules often need to refer to each other. For example, the surround module might use the echo module. In fact, such references are so common that the import statement first looks in the containing package before looking in the standard module search path.

Nota: Come suggerito da J.F. Sebastian nel commento qui sotto, l'uso di importazioni implicite non è consigliato e sono, infatti, passati in Python 3.

+9

non usare le importazioni relative implicite (sono sparite in Python 3). Usa sempre l'importazione assoluta ('da p importa a' (aggiungi' da __future__ import absolute_import' prima se c'è il file 'p/p.py')) o l'importazione relativa esplicita (' from. Importa a' (se non lo è un modulo '__main__')). Non eseguire script all'interno di una directory del pacchetto Python; antepone questa directory a sys.path che potrebbe portare allo stesso modulo disponibile sotto nomi diversi che portano a bug connessi con lo stato a livello di modulo (se si utilizzano le importazioni relative implicite, in questo caso si nascondono anche altri moduli di livello superiore). – jfs

+0

Buone note. Grazie! –

+1

Se ripubblichi è come una risposta, lo accetterò. –

0

Perché c'è un filein /p. Questo file dice a Python: "Tutti i moduli in questa cartella si trovano nel pacchetto p".

Finché esiste il file __init__.py, è possibile importare b come p.b, non importa dove ti trovi.

Così l'importazione corretta in b.py sarebbe: import p.a

+0

Quale versione di Python? Questo comportamento è cambiato in passato. –

+0

Modifica di 'b.py' come suggerito. Ora eseguendo 'import b' restituisce' ImportError: nessun modulo chiamato p.a'. Python 2.7.3 –

+0

Non si dovrebbe mai usare "import b" in uno scenario del genere. Usa sempre 'import p.b' o rendi disponibili i simboli necessari da' __init __. Py' e 'import p' per nascondere i dettagli interni. –

0

importazioni rispetto funzionano solo all'interno di pacchetti.

Se si importa b da dove ci si trova, non vi è alcuna nozione di pacchetto e quindi non è possibile importare in modo relativo.

Se si importa p.b, è il modulo b all'interno del pacchetto c.

Non è la struttura della directory che conta, ma la struttura dei pacchetti.

Problemi correlati