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
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
Buone note. Grazie! –
Se ripubblichi è come una risposta, lo accetterò. –