2010-02-24 5 views
77

Quelle est la bonne façon de corriger cette erreur ImportError?Comment réparer une erreur "ImportError: No module named ..." en Python?

je la structure de répertoire suivant:

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

Et je suis dans le répertoire

/home/bodacydo/work/project 

Maintenant, si je tape

python ./programs/my_python_program.py 

Je reçois instantanément

ImportError: No module named foo.tasks 

Le ./programs/my_python_program.py contient la ligne suivante:

from foo.tasks import my_function 

Je ne peux pas comprendre pourquoi python ne trouvera pas ./foo/tasks.py - il est là.

Si je le fais à partir du shell Python, il fonctionne:

python 
>>> from foo.tasks import my_function 

Il fonctionne ne ne pas si je l'appelle via le script python ./programs/my_python_program.py.

Répondre

81

Python ne pas ajouter le répertoire courant à sys.path, mais le répertoire que le script est. Ajouter /home/bodacydo/work/project soit sys.path ou $PYTHONPATH.

+1

Alors, quel est le point d'avoir __init__.py dans le dossier racine? Il semble ne servir à rien si vous éditez sys.path ou le chemin python. –

+7

@Editor: '__init __. Py' indique seulement que le répertoire doit être traité comme un paquet, quand son parent est dans' sys.path' ou est lui-même un paquet. –

+1

En outre, vérifiez les autorisations sur le dossier. C'était le problème dans mon cas. – SidJ

31

Avez-vous un fichier appelé __init__.py dans le répertoire foo? Si ce n'est pas le cas, python ne reconnaîtra pas foo comme un paquetage python.

Voir le section on packages dans le didacticiel Python pour plus d'informations.

+0

Merci et oui, j'avais __init __. py'. Le problème était cette fois avec '$ PYTHONPATH'. La solution d'Ignacio a fonctionné. – bodacydo

+1

Les fichiers __init__.py sont requis pour que Python traite les répertoires comme contenant des paquets; Ceci est fait pour empêcher les répertoires avec un nom commun, comme une chaîne, de masquer involontairement des modules valides qui apparaissent plus tard dans le chemin de recherche du module. Dans le cas le plus simple, __init__.py peut juste être un fichier vide – panofish

+0

Merci de m'avoir sauvé un jour. –

2

Dans mon esprit, je dois considérer que le dossier foo est une bibliothèque autonome. Je pourrais vouloir considérer le déplaçant au dossier Lib\site-packages dans une installation de python. Je pourrais envisager d'ajouter un fichier foo.pth là.

Je sais qu'il est une bibliothèque depuis le ./programs/my_python_program.py contient la ligne suivante:

from foo.tasks import my_function

Il n'a pas d'importance que ./programs est un dossier de frères et soeurs à ./foo. Il est le fait que my_python_program.py est exécuté comme un script comme celui-ci:

python ./programs/my_python_program.py

7

Voici une solution étape par étape:

  1. Ajouter un script appelé run.py dans /home/bodacydo/work/project et le modifier comme ceci:

    import programs.my_python_program 
    programs.my_python_program.main() 
    

    (remplacer main() avec votre méthode équivalente à my_python_program.)

  2. Aller à /home/bodacydo/work/project
  3. Run run.py

Explication: Depuis python pour PythonPath le joint chemin de le script à partir de laquelle il exécute, en cours d'exécution run.py ajoutera /home/bodacydo/work/project. Et voilà, import foo.tasks sera trouvé. Exemple de solution pour ajouter la bibliothèque à votre PYTHONPATH.

7

  1. Ajoutez la ligne suivante dans votre ~/.bashrc ou il suffit d'exécuter directement:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
    
  2. redirigent ensuite votre bibliothèque nécessaire dans votre dossier ~/.python, par exemple

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

Un mieux solution que la mise en PYTHONPATH est réglé correctement Cela sys.path[0] et d'utiliser python -m module.path

est un moyen plus fiable pour exécuter des modules.

J'ai un quick writeup sur ce problème, comme d'autres l'ont mentionné answerers la raison pour cela est python path/to/file.py met path/to au début du PYTHONPATH (sys.path).

Questions connexes