2015-04-09 11 views
10

Ho un progetto strutturato come tale:non riesce quando si esegue python come script, ma non in iPython?

folder1 
     | 
     folder2 
      | 
      tests 

devo __init__.py in ogni cartella. Quando sono nella directory padre di folder1, eseguo iPython e faccio

from folder1.folder2.tests.test1 import main 
main() 

tutto funziona correttamente. Tuttavia quando ho eseguito

python folder1/folder2/tests/test1.py 

ottengo ImportError: No module named folder1.folder2.file1, dove la mia istruzione import in test1 è

from folder1.folder2.file1 import class1 

confuso su questo - sto indovinando si tratta di un problema di percorso ma non capisco cosa c'è di sbagliato nel mio codice (molte configurazioni simili in altre cartelle) e perché funziona ancora in iPython e non in python come script.

risposta

8

Il module search path (python 3 docu) è diverso con e senza un file di script:

interattiva di Python interprete

(vale sia per python e ipython)

$ python 
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> print(sys.path) 
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 
>>> 

Nota la prima voce di essere un stringa vuota. Una stringa vuota è un percorso relativo equivalente a .. I percorsi relativi nel percorso di ricerca del modulo sono relativi alla directory di lavoro corrente del processo dell'interprete, quindi questa è solo la directory di lavoro corrente in cui è stato richiamato l'interprete. (Che nel tuo caso è accaduto a essere la radice del progetto.)

l'esecuzione di un file di script

$ echo 'import sys' > /tmp/pathtest.py 
$ echo 'print(sys.path)' >> /tmp/pathtest.py 
$ python /tmp/pathtest.py 
['/tmp', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 

Si noti che qui, la prima voce è il percorso assoluto della directory contenente il file di script siamo passati come argomento.

+3

quindi in pratica aggiungi "import sys; sys.path = [''] + sys.path' al tuo script – aforaudrey

+1

Inoltre, non essere tentato di usare 'sys.path.extend ([''])' (come ho fatto io), dato che l'ordine fa una differenza. – gpano

4

Ho riscontrato un problema simile durante l'importazione di numpy o di qualsiasi libreria a seconda di numpy. Il problema era che avevo un nome di file random.py nella mia cartella di progetto.

Numpy ha random.py in esso per le sue funzioni casuali, ma l'importazione ha preso il random.py della mia cartella di progetto.

La soluzione migliore è non nominare alcun file con i nomi dei moduli standard di qualsiasi libreria.

Divertiti .. :)

+0

oh mio Dio ... Grazie mille! Ho usato il nome "redmine" e ho provato ad importare il modulo redmine ... – QtRoS

Problemi correlati