"ImportError: aucun module nommé" lors de l'exécution du script Python
j'essaye de lancer un script qui lance, entre autres choses, un script python. Je reçois un ImportError: aucun module nommé ... cependant, si je lance ipython et que j'importe le même module de la même manière par l'intermédiaire de l'interpréteur, le module est accepté.
que se passe-t-il, et comment puis-je le réparer? J'ai essayé de comprendre comment python utilise PYTHONPATH mais je suis complètement confus. Toute aide serait grandement appréciée.
11 réponses
cette question se pose en raison de la façon dont L'interpréteur IPython en ligne de commande utilise votre chemin courant par rapport à la façon dont un processus séparé fait (que ce soit un ordinateur portable IPython, un processus externe, etc.). IPython cherchera des modules à importer qui ne se trouvent pas seulement dans votre système.chemin d'accès, mais aussi sur votre répertoire de travail courant. Lorsque vous démarrez un interpréteur à partir de la ligne de commande, le répertoire courant dans lequel vous travaillez est le même que celui dans lequel vous avez démarré ipython. Si vous run
import os
os.getcwd()
vous verrez que c'est vrai.
cependant, disons que vous utilisez un notebook ipython, Lancez os.getcwd()
et votre répertoire de travail actuel est à la place le dossier dans lequel vous avez dit au notebook d'opérer dans votre ipython_notebook_config.py fichier (typiquement en utilisant le paramètre c.NotebookManager.notebook_dir
).
la solution est de fournir à l'interpréteur python le chemin-vers-votre-module. La solution la plus simple est de ajoutez ce chemin à votre sys.liste des chemins. Dans votre carnet, 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-à-importer et vous devriez fournir plus d'informations sur votre problème.
la meilleure façon (et 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 des paquets/modules python. L'édition ou de l' définir le PYTHONPATH comme un var global dépend de l'os, et est discuté en détail ici pour Unix ou Windows .
il suffit de créer un fichier Python vide avec le nom __init__.py
sous le dossier qui affiche l'erreur, pendant que vous exécutez le projet python.
assurez-vous qu'ils utilisent tous les deux le même interprète. Cela m'est arrivé sur Ubuntu:
$ ipython3
> sys.version
'3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]'
$ python3
> sys.version
'3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]'
et sys.path
étaient différents entre les deux interprètes. Pour le réparer, J'ai enlevé Python 3.3.
faire sys.path.append('my-path-to-module-folder')
marchera, mais pour éviter d'avoir à faire cela en IPython chaque fois que vous voulez utiliser le module, vous pouvez ajouter export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
à votre fichier ~/.bash_profile
.
la principale raison est le sys.les chemins de Python et D'IPython sont différents.
consultez lucypark lien , la solution fonctionne dans mon cas. Cela se produit lors de l'installation opencv par
conda install opencv
et obtenu erreur d'importation dans iPython, Il ya trois étapes pour résoudre ce problème:
import cv2
ImportError: ...
1. Vérifier le chemin en Python et iPython avec la commande suivante
import sys
sys.path
vous devriez trouver qu'ils sont différents résultat. Deuxième étape, il suffit d'utiliser sys.path.append
pour résoudre le raté chemin par essai et erreur.
2. Solution temporaire
Dans iPython:
import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2
le ImportError:..
Problème résolu
3. Solution permanente
créer un profil iPython et mettre l'ajout initial:
Dans le shell bash:
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, ajouter au dossier:
c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]
fait
avant d'installer ipython, j'ai installé des modules via easy_install; dites sudo easy_install mechanize
.
après avoir installé ipython, j'ai dû relancer easy_install pour qu'ipython reconnaisse les modules.
si vous l'exécutez depuis la ligne de commande, parfois l'interpréteur python n'est pas au courant du chemin où chercher les modules.
ci-dessous est la structure de l'Annuaire de mon projet:
/project/apps/..
/project/tests/..
je courais sous la commande:
>> cd project
>> python tests/my_test.py
après avoir exécuté au-dessus de la commande j'ai obtenu au-dessous de l'erreur
no module named lib
lib a été importé en my_test.py
j'ai imprimé sys.chemin d'accès et j'ai découvert que le chemin du projet sur lequel je travaille n'est pas disponible dans LA SAJR.chemin list
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 suis pas sûr que ce soit une bonne façon de le résoudre, mais oui, ça a marché pour moi.
avait un problème similaire, corrigé en appelant python3
au lieu de python
, mes modules étaient en Python3.5.
j'ai trouvé une autre source de cet écart:
j'ai ipython installé à la fois localement et en commun dans virtualenvs. Mon problème était que, à l'intérieur d'un virtualenv nouvellement créé avec ipython, le système ipython a été repris, qui était une version différente que le python et ipython dans le virtualenv (a 2.7.x Contre a 3.5.x), et de l'hilarité s'ensuivit.
je pense que la chose intelligente à faire chaque fois que l'installation de quelque chose qui aura un binaire dans yourvirtualenv/bin
est d'exécuter immédiatement rehash
ou similaire pour n'importe quel shell que vous utilisez afin que le bon python/ipython soit détecté. (Vérifier s'il y a des crochets pip
post-installation appropriés...)
supprimer pathlib et le réinstaller.
supprimer le pathlib dans le dossier sitepackages et réinstaller le paquet pathlib en utilisant la commande pip.
pip install pathlib
C'est ainsi que je l'ai fixé:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\..')
if module_path not in sys.path:
sys.path.append(module_path)