"ImportError: Aucun module nommé" lors de la tentative d'exécution du script Python

144

J'essaye d'exécuter un script qui lance, entre autres, un script python. J'obtiens un ImportError: No module named ..., cependant, si je lance ipython et que j'importe le même module de la même manière via l'interpréteur, le module est accepté.

Que se passe-t-il et comment puis-je y remédier? J'ai essayé de comprendre comment python utilise PYTHONPATH mais je suis complètement confus. Toute aide serait grandement appréciée.

CodeOcelot
la source
4
Vous devez donner plus d'informations. Quand vous dites "exécuter un script", voulez-vous dire un script shell? Quel module ne pouvez-vous pas importer? Où se trouve ce module? Où se trouve votre script?
BrenBarn
2
Si vous voulez une réponse définitive à "ce qui se passe", démarrez python avec l' -voption et vous verrez où python trouve (ou ne trouve pas) les modules que vous importez.
FatalError
Qu'essayez-vous d'importer? Les deux scripts python sont-ils dans le même répertoire?
pynovice
2
Veuillez nous donner le code que vous exécutez, le texte complet de la trace de pile et les étapes exactes que vous prenez pour produire l'erreur. Il est assez difficile d'aider quand on ne sait pas quel est le problème exact.
MattDMo
5
Je suppose que c'est un problème que beaucoup d'utilisateurs rencontrent, même 4 ans après la première question.
CodeOcelot

Réponses:

183

Ce problème est dû à la manière dont l'interpréteur IPython de ligne de commande utilise votre chemin actuel par rapport à la manière dont un processus séparé le fait (qu'il s'agisse d'un bloc-notes IPython, d'un processus externe, etc.). IPython recherchera les modules à importer qui se trouvent non seulement dans votre sys.path, mais également dans votre répertoire de travail actuel. Lorsque vous démarrez un interpréteur à partir de la ligne de commande, le répertoire actuel dans lequel vous travaillez est le même que celui dans lequel vous avez démarré ipython. Si vous exécutez

import os
os.getcwd() 

vous verrez que c'est vrai.

Cependant, disons que vous utilisez un notebook ipython, exécutez os.getcwd()et que votre répertoire de travail actuel est à la place le dossier dans lequel vous avez indiqué au notebook de fonctionner dans votre fichier ipython_notebook_config.py (en utilisant généralement lec.NotebookManager.notebook_dir paramètre).

La solution est de fournir à l'interpréteur python le chemin d'accès à votre module. La solution la plus simple consiste à ajouter ce chemin à votre liste sys.path. Dans votre bloc-notes, essayez d'abord:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

Si cela ne fonctionne pas, vous avez un problème différent sur vos mains sans rapport avec le chemin vers l'importation et vous devriez fournir plus d'informations sur votre problème.

La meilleure façon (et la plus permanente) de résoudre ce problème est de définir votre PYTHONPATH , qui fournit à l'interpréteur des répertoires supplémentaires pour rechercher les packages / modules python. La modification ou la définition de PYTHONPATH en tant que var globale dépend du système d' exploitation et est décrite en détail ici pour Unix ou Windows .

Tyleha
la source
1
PSA: si vous êtes venu à cette question SO parce que vous obtenez cette erreur dans jupyter-notebook, alors voyez ci-dessous, stackoverflow.com/a/27944947/127971 Malheureusement, la question n'est pas assez précise pour une seule réponse.
michael
@michael cette réponse concerne l'importation de modules Python dans le cas général; le fichier dunder init.py est nécessaire lorsque l'interpréteur recherche dans les répertoires des modules à importer, notebook ou non. La réponse ci-dessus concernant le répertoire de travail de l'interpréteur de notebook et la configuration de PYTHONPATH est correcte.
BoltzmannBrain
J'ai dit qu'il y aurait plusieurs réponses correctes, en raison du libellé de la question. Je ne veux pas dire que cette réponse n'est pas correcte. Mais si vous utilisez jupyter-notebook, vous allez simplement toucher le fichier __init_.py, non? ... et, ne va pas vouloir modifier PYTHONPATHni appeler sys.path.append, même s'ils sont également corrects (correct?). Je veux dire, j'ai des dizaines de répertoires avec du code en eux, et je ne vais pas les ajouter tous au chemin - ni attendre d'autres utilisateurs à leur fichier de configuration jupyter, même s'il s'agit d'un répertoire.
michael
16

Créez simplement un fichier python vide avec le nom __init__.pysous le dossier qui affiche une erreur, pendant que vous exécutez le projet python.

Mohideen bin Mohammed
la source
1
Par « init.py », vous voulez dire «_ init_ .py», n'est-ce pas? J'ai créé le _ init_ .py en tant que fichier vide et cela a fonctionné pour moi. Merci beaucoup. Mais pourquoi est-ce nécessaire? Avant, j'avais un script python dans le même répertoire que mon notebook ipython et l'importation fonctionnait bien.
Eduardo Reis
3
en fait, init .py est utilisé pour indiquer python pour indiquer qu'il y a un paquet contenant dans cet emplacement correspondant. alors seulement il trouvera les sous-modules que vous avez créés en dessous. si vous ne créez pas ' init .py', cela signifie que python ne sait pas qu'il y a un paquet dedans. Par exemple: à partir de "Myfolder.Mypackage import Mymodules" pour cela, par exemple, vous devez lancer init .py pour indiquer à python qu'il y a un paquet ici. sinon, il ne sait pas.
Mohideen bin Mohammed
1
Oui, réponse parfaite. C'est nécessaire dans python 2.7, mais notez dans le 3
Agape Gal'lo
cela a résolu le problème en python 3 pour moi.
Rick soutient Monica
corrigé le problème pour moi aussi - en utilisant jupyter notebook, avec la source python dans le sous-répertoire du fichier ipynb; par exemple, en foo.ipynbutilisant bar/baz.py, ajoutez un bar/__init__.pyfichier vide pour que le notebook puisse utiliserfrom bar.baz import MyClass
michael
13

Assurez-vous qu'ils utilisent tous les deux le même interprète. Cela m'est arrivé sur Ubuntu:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

Et sys.pathc'était différent entre les deux interprètes. Pour résoudre ce problème, j'ai supprimé Python 3.3.

z0r
la source
ayant utilisé miniconda pour installer un tas de trucs liés à python, j'ai aussi eu exactement ce problème. L'ubuntu python 2.7 fourni est différent du miniconda python 2.7. Cette réponse m'a permis de résoudre le problème
bph
4
C'était mon problème. J'avais mis à niveau vers python 2.7.11 mais mon shell interactif iPython utilisait toujours 2.7.5. J'avais juste besoin de courir pip install --upgrade ipythonpour obtenir la dernière version, puis il utilisait automatiquement 2.7.11 par défaut.
Abundnce 10
Mon IPython est 7.4.0 alors qu'il n'y a pas du tout de version de Python.
aderchox
@aderchox Exécutez ceci en ipython pour obtenir la version de l'interpréteur:import sys; sys.version
z0r
7

La raison principale est que les sys.paths de Python et IPython sont différents.

Veuillez vous référer au lien lucypark , la solution fonctionne dans mon cas. Cela se produit lorsque vous installez opencv par

conda install opencv

Et obtenu une erreur d'importation dans iPython, il y a trois étapes pour résoudre ce problème:

import cv2
ImportError: ...

1. Vérifiez le chemin en Python et iPython avec la commande suivante

import sys
sys.path

Vous trouverez des résultats différents de Python et Jupyter. Deuxième étape, utilisez simplementsys.path.append pour corriger le chemin manqué par essai et erreur.

2. Solution temporaire

Dans iPython:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

les ImportError:.. problème résolu

3. Solution permanente

Créez un profil iPython et définissez l'ajout initial:

Dans bash shell:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

Dans vi, ajoutez au fichier:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

TERMINÉ

Jesse
la source
'création de profil ipython' .... Oui! C'est la seule solution (permanente) qui résout le notebook jupyter ne lisant pas depuis l'environnement PATH et PYTHONPATH ... sans recourir à des instructions sys.path désordonnées au début de chaque fichier (yuk). merci @jesse.
JohnL_10
6

Cela sys.path.append('my-path-to-module-folder')fonctionnera, mais pour éviter d'avoir à le faire dans IPython à chaque fois que vous souhaitez utiliser le module, vous pouvez ajouter export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"à votre ~/.bash_profilefichier.

acannon828
la source
2

Avant d'installer ipython, j'ai installé des modules via easy_install; dire sudo easy_install mechanize.

Après avoir installé ipython, j'ai dû réexécuter easy_install pour qu'ipython reconnaisse les modules.

pandorabob
la source
2

J'ai eu un problème similaire, corrigé en appelant python3au lieu de python, mes modules étaient en Python3.5.

peter n
la source
2

Si vous l'exécutez à partir de la ligne de commande, parfois l'interpréteur python ne connaît pas le chemin où rechercher les modules.

Voici la structure des répertoires de mon projet:

/project/apps/..
/project/tests/..

Je courais sous la commande:

>> cd project

>> python tests/my_test.py

Après avoir exécuté la commande ci-dessus, j'ai obtenu l'erreur ci-dessous

no module named lib

lib a été importé dans my_test.py

J'ai imprimé sys.path et compris que le chemin du projet sur lequel je travaille n'est pas disponible dans la liste sys.path

J'ai ajouté le code ci-dessous au début de mon script my_test.py.

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

Je ne sais pas si c'est un bon moyen de le résoudre, mais oui, cela a fonctionné pour moi.

Raghav salotra
la source
Cela fonctionnera si vous exécutez toujours le script à partir du même emplacement. Sinon, vous rencontrerez des problèmes car os.getcwd()obtient le répertoire dans lequel le script a été exécuté, pas le répertoire dans lequel se trouve le fichier de script.
Nathan Arthur
1

Voici comment je l'ai corrigé:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)
pomber
la source
1

J'ai constaté que la solution à ce problème était largement documentée ici:

https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/

Fondamentalement, vous devez installer les packages dans l'environnement Jupyter, en émettant des commandes shell telles que:

!{sys.executable} -m pip install numpy

Veuillez consulter le lien ci-dessus pour une réponse complète faisant autorité.

Rui Guerra
la source
0

J'ai trouvé une autre source de cet écart:

J'ai installé ipython à la fois localement et couramment dans virtualenvs. Mon problème était que, dans un virtualenv nouvellement créé avec ipython, le système ipython a été repris, qui était une version différente de python et ipython dans virtualenv (un 2.7.x contre un 3.5.x), et l'hilarité s'est ensuivie.

Je pense que la chose intelligente à faire chaque fois que vous installez quelque chose qui aura un binaire yourvirtualenv/binest d'exécuter immédiatement rehashou similaire pour le shell que vous utilisez afin que le bon python / ipython soit sélectionné. (Il faut vérifier s'il existe des pipcrochets post-installation appropriés ...)

kaleissin
la source
0

Solution sans script:

  1. Ouvrez Spyder -> Outils -> Gestionnaire PYTHONPATH
  2. Ajoutez des chemins Python en cliquant sur "Ajouter un chemin". Par exemple: 'C: \ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-packages'
  3. Cliquez sur «Synchroniser ...» pour permettre à d 'autres programmes (par exemple Jupyter Notebook) d' utiliser les chemins python définis à l 'étape 2.
  4. Redémarrez Jupyter s'il est ouvert
Loupe
la source
0

Ceci est probablement dû à différentes versions de python installées sur votre système , c'est-à-dire python2 ou python3 .

Exécutez la commande $ pip --versionet $ pip3 --versionvérifiez de quel pip provient de Python 3x . Par exemple, vous devriez voir les informations de version comme ci-dessous:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

Ensuite, exécutez le example.pyscript avec la commande ci-dessous

$ python3 example.py
Shizhen
la source
0

M'est arrivé avec l'annuaire utils. J'essayais d'importer ce répertoire comme:

from utils import somefile

utilsest déjà un package en python. Changez simplement le nom de votre répertoire en quelque chose de différent et cela devrait fonctionner correctement.

subtleseeker
la source
0

Ce type d'erreurs se produit probablement en raison de conflits de version de python. Par exemple, si votre application s'exécute uniquement sur python 3 et que vous avez également python 2, il est préférable de spécifier la version à utiliser. Par exemple, utilisez

python3 .....

au lieu de

python
Nu-ONE
la source
0

Cette réponse s'applique à cette question si

  1. Vous ne voulez pas changer votre code
  2. Vous ne voulez pas changer définitivement PYTHONPATH

Modifier temporairement PYTHONPATH

le chemin ci-dessous peut être relatif

PYTHONPATH=/path/to/dir python script.py
kon psych
la source
0

import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') import ta

Shiva Kumar
la source
-1

Retirez-le pathlibet réinstallez-le. Supprimez le pathlib dans le sitepackagesdossier et réinstallez le package pathlib à l'aide de la commande pip:

pip install pathlib
user3233042
la source