73 votes

Exécuter Jupyter avec plusieurs chemins Python et IPython

J'aimerais travailler avec les carnets Jupyter, mais j'ai eu des difficultés à effectuer des importations de base (telles que import matplotlib). Je pense que c'est parce que j'ai plusieurs installations python gérées par l'utilisateur. Par exemple :

> which -a python
/usr/bin/python
/usr/local/bin/python

> which -a ipython
/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
/usr/local/bin/ipython

> which -a jupyter
/Library/Frameworks/Python.framework/Versions/3.5/bin/jupyter
/usr/local/bin/jupyter

J'avais l'habitude d'avoir anaconda, mais je l'ai supprimé du répertoire ~/anaconda. Maintenant, lorsque je démarre un Jupyter Notebook, j'obtiens une Kernel Error :

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py",
line 1551, in _execute_child raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2]
No such file or directory: '/Users/npr1/anaconda/envs/py27/bin/python' 

Que dois-je faire ?

1 votes

Quelle est la trace complète de l'erreur ?

215voto

jakevdp Points 4711

Ce problème est assez simple à résoudre, mais il faut comprendre trois concepts différents :

  1. Comment utiliser Unix/Linux/OSX $PATH pour trouver les exécutables ( %PATH% dans Windows)
  2. Comment Python installe et trouve les paquets
  3. Comment Jupyter sait quel Python utiliser

Dans un souci d'exhaustivité, je vais essayer de faire un rapide ELI5 sur chacun d'entre eux, afin que vous sachiez comment résoudre ce problème de la meilleure façon pour vous.

1. Unix/Linux/OSX $PATH

Lorsque vous tapez une commande à l'invite (disons, python ), le système a une séquence bien définie d'endroits où il cherche l'exécutable. Cette séquence est définie dans une variable système appelée PATH que l'utilisateur peut spécifier. Pour voir votre PATH vous pouvez taper echo $PATH .

Le résultat est une liste de répertoires sur votre ordinateur, qui seront recherchés. dans l'ordre pour l'exécutable souhaité. D'après votre sortie ci-dessus, je suppose qu'il contient ceci :

$ echo $PATH
/usr/bin/:/Library/Frameworks/Python.framework/Versions/3.5/bin/:/usr/local/bin/

Dans Windows echo %path%

Probablement avec d'autres chemins entrecoupés aussi. Ce que cela signifie, c'est que lorsque vous tapez python le système passe en mode /usr/bin/python . Lorsque vous tapez ipython dans cet exemple, le système passe en mode /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython parce qu'il n'y a pas de ipython en /usr/bin/ .

Il est toujours important de savoir quel est l'exécutable que vous utilisez, surtout lorsque vous avez plusieurs installations du même programme sur votre système. Changer le chemin d'accès n'est pas trop compliqué ; voir par exemple Comment définir de façon permanente $PATH sous Linux ? .

Windows - Comment définir les variables d'environnement dans Windows 10

2. Comment Python trouve les paquets

Lorsque vous exécutez python et faites quelque chose comme import matplotlib Python doit jouer un jeu similaire pour trouver le paquet que vous avez en tête. Similaire à $PATH sous unix, Python a sys.path qui les spécifie :

$ python
>>> import sys
>>> sys.path
['',
 '/Users/jakevdp/anaconda/lib/python3.5', 
 '/Users/jakevdp/anaconda/lib/python3.5/site-packages',
 ...]

Quelques points importants : par défaut, la première entrée dans le fichier sys.path est le répertoire courant. Aussi, à moins que vous ne modifiiez ceci (ce que vous ne devriez pas faire à moins de savoir exactement ce que vous faites), vous trouverez généralement quelque chose appelé site-packages dans le chemin : il s'agit de l'endroit par défaut où Python place les paquets lorsque vous les installez à l'aide de la commande python setup.py install o pip o conda ou un moyen similaire.

Ce qu'il faut retenir, c'est que chaque installation de python a ses propres sites-packages où les paquets sont installés pour cette version spécifique de Python . En d'autres termes, si vous installez quelque chose pour, par ex. /usr/bin/python entonces ~/anaconda/bin/python ne peut pas utiliser ce paquet car il a été installé sur un autre Python ! C'est pourquoi, dans notre échange sur Twitter, je vous ai recommandé de vous concentrer sur une seule installation Python, et de corriger votre $PATH pour que vous n'utilisiez que celui que vous voulez utiliser.

Il y a une autre composante à cela : certains paquets Python sont fournis avec des scripts autonomes que vous pouvez exécuter à partir de la ligne de commande (les exemples sont les suivants pip , ipython , jupyter , pep8 ) Par défaut, ces exécutables seront placés dans le répertoire même chemin de répertoire que le Python utilisé pour les installer, et sont conçus pour fonctionner uniquement avec cette installation Python .

Cela signifie que, lorsque votre système est configuré, lorsque vous exécutez python vous obtenez /usr/bin/python mais lorsque vous exécutez ipython vous obtenez /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython qui est associé à la version de Python à l'adresse /Library/Frameworks/Python.framework/Versions/3.5/bin/python ! En outre, cela signifie que les paquets que vous pouvez importer lors de l'exécution de la commande python sont entièrement distincts des paquets que vous pouvez importer en exécutant ipython ou un carnet de notes Jupyter : vous utilisez deux installations Python complètement indépendantes.

Alors comment réparer cela ? Eh bien, assurez-vous d'abord que votre $PATH La variable fait ce que vous voulez qu'elle fasse. Vous avez probablement un script de démarrage appelé quelque chose comme ~/.bash_profile o ~/.bashrc qui fixe cette $PATH variable. Sous Windows, vous pouvez modifier les variables d'environnement spécifiques à l'utilisateur. Vous pouvez les modifier manuellement si vous souhaitez que votre système recherche des éléments dans un ordre différent. Lorsque vous installez anaconda/miniconda pour la première fois, il y aura une option pour faire cela automatiquement (ajouter Python au PATH) : dites oui à cela, et ensuite python pointera toujours vers ~/anaconda/python ce qui est probablement ce que vous voulez.

3. Comment Jupyter sait quel Python utiliser

Nous ne sommes pas encore totalement sortis de l'eau. Vous avez mentionné que dans le carnet Jupyter, vous obtenez une erreur de noyau : cela indique que Jupyter recherche une version inexistante de Python.

Jupyter est configuré pour pouvoir utiliser un large éventail de "noyaux", ou moteurs d'exécution pour le code. Il peut s'agir de Python 2, Python 3, R, Julia, Ruby... il y a des dizaines de noyaux possibles à utiliser. Mais pour que cela soit possible, Jupyter doit connaître pour rechercher l'exécutable associé : c'est-à-dire qu'il doit savoir quel est le chemin d'accès à l'exécutable. python est assis dans.

Ces chemins sont spécifiés dans l'interface de jupyter kernelspec et il est possible pour l'utilisateur de les adapter à ses envies. Par exemple, voici la liste des noyaux que j'ai sur mon système :

$ jupyter kernelspec list
Available kernels:
  python2.7        /Users/jakevdp/.ipython/kernels/python2.7
  python3.3        /Users/jakevdp/.ipython/kernels/python3.3
  python3.4        /Users/jakevdp/.ipython/kernels/python3.4
  python3.5        /Users/jakevdp/.ipython/kernels/python3.5
  python2          /Users/jakevdp/Library/Jupyter/kernels/python2
  python3          /Users/jakevdp/Library/Jupyter/kernels/python3

Chacun d'entre eux est un répertoire contenant des métadonnées qui spécifient le nom du noyau, le chemin vers l'exécutable et d'autres informations pertinentes.
Vous pouvez ajuster les noyaux manuellement, en modifiant les métadonnées à l'intérieur des répertoires listés ci-dessus.

La commande pour installer un noyau peut changer en fonction du noyau. IPython s'appuie sur la commande paquet ipykernel qui contient une commande pour installer un noyau python : par exemple

$  python -m ipykernel install

Il créera un kernelspec associé à l'exécutable Python que vous utilisez pour exécuter cette commande. Vous pouvez ensuite choisir ce noyau dans le carnet Jupyter pour exécuter votre code avec ce Python.

Vous pouvez voir d'autres options que ipykernel fournit en utilisant la commande help :

$ python -m ipykernel install --help
usage: ipython-kernel-install [-h] [--user] [--name NAME]
                              [--display-name DISPLAY_NAME] [--prefix PREFIX]
                              [--sys-prefix]

Install the IPython kernel spec.

optional arguments:
  -h, --help            show this help message and exit
  --user                Install for the current user instead of system-wide
  --name NAME           Specify a name for the kernelspec. This is needed to
                        have multiple IPython kernels at the same time.
  --display-name DISPLAY_NAME
                        Specify the display name for the kernelspec. This is
                        helpful when you have multiple IPython kernels.
  --prefix PREFIX       Specify an install prefix for the kernelspec. This is
                        needed to install into a non-default location, such as
                        a conda/virtual-env.
  --sys-prefix          Install to Python's sys.prefix. Shorthand for
                        --prefix='/Users/bussonniermatthias/anaconda'. For use
                        in conda/virtual-envs.

Remarque : la version récente de anaconda est livré avec une extension pour le notebook qui devrait détecter automatiquement vos différents environnements conda si le fichier ipykernel y est installé.

Récapitulatif : Régler votre problème

Donc, avec ce contexte, votre problème est assez facile à résoudre :

  1. Définissez votre PATH afin que la version de Python souhaitée soit la première. Par exemple, vous pouvez exécuter export PATH="/path/to/python/bin:$PATH" pour spécifier (une fois) quel Python vous souhaitez utiliser. Pour le faire de manière permanente, ajoutez cette ligne à votre fichier .bash_profile / .bashrc (notez qu'anaconda peut le faire automatiquement pour vous lorsque vous l'installez). Je vous recommande d'utiliser le Python fourni avec anaconda ou miniconda : cela vous permettra de conda install tous les outils dont vous avez besoin.

  2. Assurez-vous que les paquets que vous voulez utiliser sont installés pour que python. Si vous utilisez conda, vous pouvez taper par exemple conda install jupyter matplotlib scikit-learn pour installer ces paquets pour anaconda/bin/python .

  3. Assurez-vous que vos noyaux Jupyter pointent vers les versions de Python que vous souhaitez utiliser. Lorsque vous conda install jupyter il devrait mettre cela en place pour anaconda/bin/python automatiquement. Sinon, vous pouvez utiliser la fonction jupyter kernelspec ou python -m ipykernel install pour ajuster les noyaux existants ou en installer de nouveaux.

  4. Pour installer des modules dans d'autres noyaux Python Jupyter non gérés par Anaconda, vous devez copier le chemin d'accès à l'exécutable Python pour le noyau et exécuter /path/to/python -m pip install <package>

J'espère que c'est clair... Bonne chance !

6 votes

C'est une excellente réponse. Merci d'avoir pris le temps de l'écrire.

0 votes

Sur mon Mac, la seule façon de résoudre tous les problèmes liés à jupyter et ipython était d'ajouter /Library/Frameworks/Python.framework/Versions/3.5/bin/ dans mon bashrc . merci

1 votes

Pour info, j'ai dû exécuter pip3 install ipykernel también.

7voto

arpan Points 49

@jakevdp l'a très bien expliqué.

Quand j'ai mis à jour mon ubuntu, j'ai eu le même problème et je l'ai résolu en changeant le fichier de configuration du noyau (kernel.json). Pour lister l'emplacement des fichiers du noyau. Utilisez

jupyter kernelspec list

Il retournera

Available kernels:
  python3    /home/user1/.local/share/jupyter/kernels/python3
  python2    /usr/local/share/jupyter/kernels/python2

J'utilisais python3, j'ai donc modifié le fichier à l'endroit suivant

/home/user1/.local/share/jupyter/kernels/python3

en suivant l'étape

nano /home/user1/.local/share/jupyter/kernels/python3/kernel.json

Là, à l'intérieur argv J'ai modifié le premier paramètre (c'est-à-dire le chemin du répertoire python3) sous la forme suivante

"/usr/bin/python3.5"

à

"/usr/bin/python3"

et l'a sauvegardé avec ctr+x et redémarré jupyter-notebook.

1voto

rishi jain Points 83

J'ai également découvert qu'il ne faut pas mettre votre environnement virtuel à l'intérieur du dépôt git car il devient illisible pour lire les paquets python. Il semble que différentes permissions soient utilisées lors de la lecture et de l'écriture (écriture - installation d'un paquet - utilisation de pip), comment être incapable de lire. Par conséquent, pour moi, les bibliothèques python ont été lues à partir de l'installation du système et non de l'environnement virtuel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X