web-dev-qa-db-fra.com

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

J'essaie d'exécuter un script qui lance, entre autres choses, un script python. Je reçois un message ImportError: Pas de module nommé ... Toutefois, 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 résoudre ce problème? J'ai essayé de comprendre comment python utilise PYTHONPATH mais je suis complètement confus. Toute aide serait grandement appréciée.

109
CodeOcelot

Ce problème se pose en raison de la façon dont l'interpréteur IPython en ligne de commande utilise votre chemin actuel par rapport à la façon dont un processus séparé utilise (qu'il s'agisse d'un bloc-notes IPython , 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 vous trouvez 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, supposons que vous utilisiez un bloc-notes ipython, exécutez os.getcwd() et votre répertoire de travail actuel est plutôt le dossier dans lequel vous avez demandé au bloc-notes de fonctionner dans votre fichier ipython_notebook_config.py (généralement à l'aide du fichier c.NotebookManager.notebook_dir réglage).

La solution consiste à fournir à l'interprète python le chemin vers votre module. La solution la plus simple consiste à ajouter ce chemin à votre liste sys.path. Dans votre cahier, 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 qui n'est pas lié au chemin d'accès à l'importation et vous devez fournir plus d'informations sur votre problème.

Le meilleur moyen (et le plus permanent) de résoudre ce problème consiste à définir votre PYTHONPATH, qui fournit à l'interprète des répertoires supplémentaires dans lesquels rechercher python packages/modules. La modification ou la définition de PYTHONPATH en tant que variable globale dépend du système d'exploitation. Elle est décrite en détail ici pour nix ou Windows .

152
tyleha

Créez simplement un fichier python vide portant le nom __init__.py sous le dossier qui affiche une erreur lors de l'exécution du projet python.

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.path était différent entre les deux interprètes. Pour résoudre ce problème, j'ai supprimé Python 3.3.

10
z0r

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

6
acannon828

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

Veuillez vous référer à lien lucypark , la solution fonctionne dans mon cas. Cela se produit lorsque install opencv by

conda install opencv

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

import cv2
ImportError: ...

1. Vérifier le chemin d'accès dans Python et iPython avec la commande suivante

import sys
sys.path

Vous trouverez un résultat différent de Python et de Jupyter. Deuxième étape, utilisez simplement sys.path.append pour corriger le chemin d'accès manquant par erreur.

2. Solution temporaire

En iPython:

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

le problème ImportError:.. 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É

5
Jesse

Avant d'installer ipython, j'ai installé les modules via easy_install; dites Sudo easy_install mechanize.

Après avoir installé ipython, j'ai dû relancer easy_install pour ipython afin de reconnaître les modules.

2
pandorabob

Si vous l'exécutez à partir de la ligne de commande, parfois, l'interpréteur python n'a pas connaissance du chemin où rechercher les modules.

Vous trouverez ci-dessous la structure de répertoire de mon projet:

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

Je courais en dessous de 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 découvert 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 suis pas sûr que ce soit un bon moyen de le résoudre mais oui, cela a fonctionné pour moi.

2
Raghav salotra

J'ai trouvé que la solution à ce problème avait été documentée en détail 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

S'il vous plaît vérifier le lien ci-dessus pour une réponse complète faisant autorité.

1
Rui Guerra

Si un problème similaire avait été résolu en appelant python3 au lieu de python, mes modules étaient en Python3.5.

1
peter n

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

J'ai ipython installé à la fois localement et généralement dans virtualenvs. Mon problème était que, dans une virtualenv nouvellement créée avec ipython, l'ipython système avait été récupéré, une version différente de celle de python et ipython de virtualenv (2.7.x contre 3.5.x). ), et l'hilarité s'est ensuivie.

Je pense que la meilleure chose à faire chaque fois que vous installez quelque chose qui aura un binaire dans yourvirtualenv/bin consiste à lancer immédiatement rehash ou similaire pour le shell que vous utilisez, afin que le python/ipython correct soit capturé. (Je dois vérifier s'il y a des crochets appropriés pip après l'installation ...)

0
kaleissin

Solution sans script:

  1. Ouvrez Spyder -> Outils -> Gestionnaire PYTHONPATH
  2. Ajoutez Python chemins en cliquant sur "Ajouter un chemin". E.g: 'C:\Utilisateurs\Utilisateur\AppData\Local\Programmes\Python\Python37\Lib\site-packages'
  3. Cliquez sur "Synchroniser ..." pour autoriser d'autres programmes (par exemple, Jupyter Notebook) à utiliser les chemins python définis à l'étape 2.
  4. Redémarrez Jupyter s'il est ouvert
0
Wen

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

Exécutez la commande $ pip --version et $ pip3 --version pour vérifier quel pip est de at 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)

Puis exécutez le script example.py avec la commande ci-dessous

$ python3 example.py
0
shizhen

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)
0
pomber