2010-02-24 12 views
77

Qual è il modo corretto per correggere questo errore ImportError?Come risolvere l'errore "ImportError: No module named ..." in Python?

Ho la seguente struttura di directory:

/home/bodacydo 
/home/bodacydo/work 
/home/bodacydo/work/project 
/home/bodacydo/work/project/programs 
/home/bodacydo/work/project/foo 

E sono nella directory

/home/bodacydo/work/project 

Ora, se digito

python ./programs/my_python_program.py 

ho immediatamente ottenere

ImportError: No module named foo.tasks 

Il ./programs/my_python_program.py contiene la seguente riga:

from foo.tasks import my_function 

non riesco a capire il motivo per cui Python non troverà ./foo/tasks.py - è lì.

Se lo faccio dal guscio Python, allora funziona:

python 
>>> from foo.tasks import my_function 

E 'solo non funziona se lo chiamo via python ./programs/my_python_program.py script.

risposta

81

Python non aggiunge la directory corrente sys.path, ma piuttosto la directory che lo script è in. Aggiungi /home/bodacydo/work/project a uno o sys.path$PYTHONPATH.

+1

Quindi qual è il punto allora di avere __init__.py nella cartella principale? Sembra non servire se si modifica sys.path o pythonpath. –

+7

@Editor: '__init __. Py' indica solo che la directory deve essere trattata come un pacchetto, quando il suo genitore è in' sys.path' o è esso stesso un pacchetto. –

+1

Controllare inoltre i permessi sulla cartella. Questo era il problema nel mio caso. – SidJ

31

Avete un file chiamato __init__.py nella directory foo? Altrimenti Python non riconoscerà foo come un pacchetto python.

Vedere il section on packages nell'esercitazione su Python per ulteriori informazioni.

+0

Grazie e sì, ho avuto '__init __. py'. Il problema questa volta era con '$ PYTHONPATH'. La soluzione di Ignacio ha funzionato. – bodacydo

+1

I file __init__.py sono necessari per far sì che Python tratti le directory come contenenti i pacchetti; questo viene fatto per evitare che le directory con un nome comune, come una stringa, nascondano involontariamente moduli validi che si verificano in un secondo momento nel percorso di ricerca del modulo. Nel caso più semplice, __init__.py può essere solo un file vuoto – panofish

+0

Grazie per avermi salvato qualche volta. –

2

Nella mia mente devo considerare che la cartella foo è una libreria autonoma. Potrei prendere in considerazione la possibilità di spostarlo nella cartella Lib\site-packages all'interno di un'installazione python. Potrei prendere in considerazione l'idea di aggiungere un file foo.pth lì.

so che è una libreria in quanto la ./programs/my_python_program.py contiene la seguente riga:

from foo.tasks import my_function

Quindi non importa che ./programs è una cartella di pari livello a ./foo. E 'il fatto che my_python_program.py viene eseguito come uno script come questo:

python ./programs/my_python_program.py

7

Ecco una soluzione step-by-step:

  1. Aggiungere uno script chiamato run.py in /home/bodacydo/work/project e modificarlo in questo modo:

    import programs.my_python_program 
    programs.my_python_program.main() 
    

    (sostituire main() con il metodo equivalente in my_python_program.)

  2. Vai /home/bodacydo/work/project
  3. Run run.py

Spiegazione: Dal pitone aggiunge al PYTHONPATH il percorso della lo script da cui viene eseguito, in esecuzione run.py aggiungerà /home/bodacydo/work/project. E voilà, import foo.tasks sarà trovato.

7

Esempio di soluzione per aggiungere la libreria al tuo PYTHONPATH.

  1. Aggiungere la seguente riga nel vostro ~/.bashrc o semplicemente eseguirlo direttamente:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
    
  2. quindi collegare la vostra libreria richiesta nella cartella ~/.python, per esempio

    ln -s /home/user/work/project/foo ~/.python/ 
    
0

Un meglio correzione di impostazione PYTHONPATH è utilizzare python -m module.path

Ciò correttamente impostato sys.path[0] ed è un modo più affidabile per eseguire moduli.

Ho un quick writeup su questo problema, come altri hanno menzionato l'answerers ragione di questo èpython path/to/file.py mette path/to sull'inizio della PYTHONPATH (sys.path).

Problemi correlati