Quelle est la bonne façon de corriger cette erreur ImportError?
J'ai la structure de répertoires suivante:
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
Et je suis dans l'annuaire
/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, cela fonctionne:
python
>>> from foo.tasks import my_function
Cela ne fonctionne que si je l'appelle via un python ./programs/my_python_program.py
script.
__init__.py
indique uniquement que le répertoire doit être traité comme un package, lorsque son parent est danssys.path
ou est lui-même un package.export PYTHONPATH=`pwd`
/home/bodacydo/work
... voir cette réponseAvez-vous un fichier appelé
__init__.py
dans le répertoire foo? Sinon, python ne reconnaîtra pas foo comme un package python.Consultez la section sur les packages dans le didacticiel python pour plus d'informations.
la source
__init__.py
. Le problème cette fois était avec$PYTHONPATH
. La solution d'Ignacio a fonctionné.Voici une solution étape par étape:
Ajouter un script appelé
run.py
dans/home/bodacydo/work/project
et modifier comme ceci:(remplacez
main()
par votre méthode équivalente dansmy_python_program
.)/home/bodacydo/work/project
run.py
Explication: Étant donné que python ajoute à PYTHONPATH le chemin du script à partir duquel il s'exécute , l'exécution
run.py
s'ajoutera/home/bodacydo/work/project
. Et voilà ,import foo.tasks
sera trouvé.la source
Exemple de solution pour ajouter la bibliothèque à votre PYTHONPATH.
Ajoutez la ligne suivante dans votre ~ / .bashrc ou exécutez-la directement:
Ensuite, liez votre bibliothèque requise dans votre dossier ~ / .python, par exemple
la source
Une meilleure solution que le réglage
PYTHONPATH
consiste à utiliserpython -m module.path
Cela sera correctement défini
sys.path[0]
et constitue un moyen plus fiable d'exécuter des modules.J'ai un bref aperçu de ce problème, car d'autres répondants ont mentionné que la raison en est
python path/to/file.py
placéepath/to
au début duPYTHONPATH
(sys.path
).la source
Dans mon esprit, je dois considérer que le
foo
dossier est une bibliothèque autonome. Je pourrais vouloir envisager de le déplacer dans leLib\site-packages
dossier dans une installation python. Je pourrais envisager d'ajouter unfoo.pth
fichier là-bas.Je sais que c'est une bibliothèque car le
./programs/my_python_program.py
contient la ligne suivante:Donc, peu importe que ce
./programs
soit un dossier frère./foo
. C'est le fait qu'ilmy_python_program.py
soit exécuté comme un script comme celui-ci:la source
Si vous rencontrez ce problème lors de l'utilisation d'une version installée, lors de l'utilisation
setup.py
, assurez-vous que votre module est inclus à l'intérieurpackages
la source