136 votes

Comment résoudre le problème "ImportError : No module named ..." en Python ?

Quelle est la bonne façon de corriger cette erreur ImportError ?

J'ai la structure de répertoire suivante :

/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

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

from foo.tasks import my_function

Je ne comprends pas pourquoi python ne trouve pas ./foo/tasks.py - il est là.

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

python
>>> from foo.tasks import my_function

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

145voto

Ignacio Vazquez-Abrams Points 312628

Python n'ajoute pas le répertoire actuel à sys.path mais plutôt le répertoire dans lequel se trouve le script. Ajouter /home/bodacydo/work/project à l'une ou l'autre sys.path ou $PYTHONPATH .

38voto

Dave Kirby Points 12310

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 sur les paquets dans le tutoriel python pour plus d'informations.

11voto

Anthony Sottile Points 3629

A meilleur que de fixer PYTHONPATH est d'utiliser python -m module.path

Cela permet de définir correctement sys.path[0] et constitue un moyen plus fiable d'exécuter des modules.

J'ai un résumé rapide sur ce problème, d'autres personnes ayant répondu ont mentionné la raison car c'est python path/to/file.py met path/to au début de la PYTHONPATH ( sys.path ).

9voto

cyborg Points 5463

Voici une solution étape par étape :

  1. Ajouter un script appelé run.py en /home/bodacydo/work/project et modifiez-le comme suit :

    import programs.my_python_program
    programs.my_python_program.main()

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

  2. Aller à /home/bodacydo/work/project

  3. Ejecutar run.py

Explication : Puisque python ajoute à PYTHONPATH le chemin de le script à partir duquel il s'exécute , en cours d'exécution run.py ajoutera /home/bodacydo/work/project . Et voilà , import foo.tasks sera trouvée.

8voto

kenorb Points 2464

Exemple de solution pour ajouter la bibliothèque à votre PYTHONPATH.

  1. Ajoutez la ligne suivante dans votre ~/.bashrc ou exécutez-la directement :

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. Liez ensuite la bibliothèque requise dans votre dossier ~/.python, par exemple

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X