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.
python
ipython
jupyter-notebook
importerror
CodeOcelot
la source
la source
-v
option et vous verrez où python trouve (ou ne trouve pas) les modules que vous importez.Réponses:
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
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:
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 .
la source
__init_.py
, non? ... et, ne va pas vouloir modifierPYTHONPATH
ni appelersys.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.Créez simplement un fichier python vide avec le nom
__init__.py
sous le dossier qui affiche une erreur, pendant que vous exécutez le projet python.la source
foo.ipynb
utilisantbar/baz.py
, ajoutez unbar/__init__.py
fichier vide pour que le notebook puisse utiliserfrom bar.baz import MyClass
Assurez-vous qu'ils utilisent tous les deux le même interprète. Cela m'est arrivé sur Ubuntu:
Et
sys.path
c'était différent entre les deux interprètes. Pour résoudre ce problème, j'ai supprimé Python 3.3.la source
pip install --upgrade ipython
pour obtenir la dernière version, puis il utilisait automatiquement 2.7.11 par défaut.import sys; sys.version
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:
1. Vérifiez le chemin en Python et iPython avec la commande suivante
Vous trouverez des résultats différents de Python et Jupyter. Deuxième étape, utilisez simplement
sys.path.append
pour corriger le chemin manqué par essai et erreur.2. Solution temporaire
Dans iPython:
les
ImportError:..
problème résolu3. Solution permanente
Créez un profil iPython et définissez l'ajout initial:
Dans bash shell:
Dans vi, ajoutez au fichier:
TERMINÉ
la source
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 ajouterexport PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
à votre~/.bash_profile
fichier.la source
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.
la source
J'ai eu un problème similaire, corrigé en appelant
python3
au lieu depython
, mes modules étaient en Python3.5.la source
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:
Je courais sous la commande:
Après avoir exécuté la commande ci-dessus, j'ai obtenu l'erreur ci-dessous
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
.Je ne sais pas si c'est un bon moyen de le résoudre, mais oui, cela a fonctionné pour moi.
la source
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.Voici comment je l'ai corrigé:
la source
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:
Veuillez consulter le lien ci-dessus pour une réponse complète faisant autorité.
la source
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/bin
est d'exécuter immédiatementrehash
ou similaire pour le shell que vous utilisez afin que le bon python / ipython soit sélectionné. (Il faut vérifier s'il existe despip
crochets post-installation appropriés ...)la source
Solution sans script:
la source
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 --version
et$ pip3 --version
vérifiez de quel pip provient de Python 3x . Par exemple, vous devriez voir les informations de version comme ci-dessous:Ensuite, exécutez le
example.py
script avec la commande ci-dessousla source
M'est arrivé avec l'annuaire
utils
. J'essayais d'importer ce répertoire comme:utils
est 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.la source
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
au lieu de
la source
Cette réponse s'applique à cette question si
Modifier temporairement PYTHONPATH
le chemin ci-dessous peut être relatif
la source
import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') import ta
la source
Retirez-le
pathlib
et réinstallez-le. Supprimez le pathlib dans lesitepackages
dossier et réinstallez le package pathlib à l'aide de la commande pip:la source