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.
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 .
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.
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.
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
.
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É
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.
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.
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é.
Si un problème similaire avait été résolu en appelant python3
au lieu de python
, mes modules étaient en Python3.5.
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 ...)
Solution sans script:
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
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)