Courir Jupyter avec plusieurs chemins Python et IPython
j'aimerais travailler avec Jupyter notebooks, mais j'ai eu de la difficulté à faire des importations de base (comme 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 supprimé si dans le répertoire ~/anaconda. Maintenant, quand je démarre un carnet Jupyter, j'obtiens une erreur du noyau:
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 réponses
c'est assez simple à résoudre, mais cela implique de comprendre trois concepts différents:
- Comment Unix/Linux/OSX utiliser
$PATH
pour trouver les exécutables (%PATH%
dans Windows) - comment Python installe et trouve les paquets""
- comment Jupyter sait ce que Python utiliser
par souci d'exhaustivité, je vais essayer de faire un ELI5 rapide sur chacun de ceux-ci, savoir comment résoudre ce problème de la meilleure façon pour vous.
1. Unix / Linux / OSX $ PATH
lorsque vous tapez n'importe quelle commande à l'invite (dites python
), le système a une séquence bien définie d'endroits qu'il recherche pour l'exécutable. Cette séquence est définie dans une variable système appelé 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. De 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. Cela signifie que lorsque vous tapez python
, le système passera à /usr/bin/python
. Lorsque vous tapez ipython
, dans cet exemple, le système passera à /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
, parce que il n'y a pas de ipython
dans /usr/bin/
.
il est toujours important de savoir quel exécutable vous utilisez, en particulier lorsque vous avez autant d'installations du même programme sur votre système. Changer le chemin n'est pas trop compliqué; voir par exemple comment définir $PATH de façon permanente sur Linux? .
Windows Comment définir les variables d'environnement de Windows 10
2. Comment Python trouve les colis
quand 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. Semblable à $PATH
dans unix, Python a sys.path
qui spécifie ceci:
$ python
>>> import sys
>>> sys.path
['',
'/Users/jakevdp/anaconda/lib/python3.5',
'/Users/jakevdp/anaconda/lib/python3.5/site-packages',
...]
Certaines choses importantes: par défaut, la première entrée dans sys.path
est le répertoire courant. Aussi, à moins que vous ne modifiez ceci (ce que vous ne devriez pas faire à moins que vous sachiez exactement ce que vous faites) vous habituellement trouver quelque chose appelé site-packages
dans le chemin: c'est l'endroit par défaut que Python met les paquets quand vous les installez en utilisant python setup.py install
, ou pip
, ou conda
, ou un moyen similaire.
la chose importante à noter est que chaque installation python a son propre site-paquets , où les paquets sont installés pour cette version Python spécifique . En d'autres termes, si vous installez quelque chose, par exemple /usr/bin/python
, puis ~/anaconda/bin/python
ne peut pas utiliser ce paquet , parce qu'il a été installé sur un Python différent! C'est pourquoi dans notre échange twitter je vous ai recommandé de vous concentrer sur une installation de Python, et de corriger votre $PATH
pour que vous utilisiez seulement celle que vous voulez utiliser.
il y a un autre composant à cela: certains paquets Python sont fournis avec des scripts autonomes que vous pouvez exécuter depuis la ligne de commande (exemples: pip
, ipython
, jupyter
, pep8
, etc. Par défaut, ces exécutables seront placés dans le même chemin de répertoire que le Python utilisé pour les installer, et sont conçus pour fonctionner seulement avec cette installation de 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 Python au /Library/Frameworks/Python.framework/Versions/3.5/bin/python
! De plus, cela signifie que les paquets que vous pouvez importer en exécutant python
sont entièrement séparés des paquets que vous pouvez importer en exécutant ipython
ou un carnet Jupyter: vous utilisez deux installations Python complètement indépendantes.
alors comment réparer ça? D'abord, assurez-vous que votre variable $PATH
fait ce que vous voulez. Vous avez probablement un script de démarrage appelé quelque chose comme ~/.bash_profile
ou ~/.bashrc
qui définit ceci $PATH
à la variable. Sur Windows, vous pouvez modifier les variables d'environnement spécifiques à l'utilisateur. Vous pouvez modifier cela manuellement si vous voulez que votre système recherche des choses dans un ordre différent. Quand vous installerez anaconda / miniconda, il y aura une option pour le faire automatiquement (ajouter Python au chemin): dites oui à cela, et alors python
pointera toujours vers ~/anaconda/python
, ce qui est probablement ce que vous voulez.
3. Comment Jupyter sait ce que Python utiliser
nous ne sommes pas encore totalement hors de l'eau. Vous avez mentionné que dans le carnet Jupyter, vous avez une erreur de noyau: cela indique que Jupyter est à la recherche d'une version Python inexistante.
Jupyter est configuré pour pouvoir utiliser une large gamme de "noyaux", ou moteurs d'exécution pour le code. Ceux-ci peuvent être Python 2, Python 3, R, Julia, Ruby... il y a des douzaines de noyaux possibles à utiliser. Mais pour que cela se produise, Jupyter doit savoir où pour rechercher l'exécutable associé: c'est-à-dire qu'il doit savoir dans quel chemin se trouve le python
.
ces chemins sont spécifiés dans le kernelspec
de jupyter , et il est possible pour l'utilisateur de les ajuster à leurs désirs. 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 de ces est un répertoire contenant des métadonnées qui spécifie le nom du noyau, le chemin vers l'exécutable, et d'autres informations pertinentes.
Vous pouvez ajuster les noyaux manuellement, en éditant les métadonnées dans les répertoires énumérés ci-dessus.
La commande pour installer un noyau peut changer en fonction du noyau. IPython s'appuie sur le paquet ipykernel qui contient une commande pour installer un noyau python: par exemple
$ python -m ipykernel install
il va créer un kernelspec associé à L'exécutable Python que vous utilisez pour l'exécution de cette commande. Vous pouvez alors 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 d'aide:
$ 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.
Note: la version récente de anaconda bateaux avec une extension pour le notebook qui devrait détecter automatiquement vos différents environnements conda si le paquet ipykernel
y est installé.
résumé: corriger votre problème
ainsi, avec ce contexte, votre question est assez facile à corriger:
-
Paramétrez votre
PATH
de sorte que la version Python désirée soit la première. Par exemple, vous pouvez lancerexport PATH="/path/to/python/bin:$PATH"
pour spécifier (une fois) quel Python vous souhaitez utiliser. Pour ce faire en permanence, Ajoutez cette ligne à vos.bash_profile
/.bashrc
(notez qu'anaconda peut le faire automatiquement pour vous lorsque vous installez il.) Je recommande d'utiliser le Python qui est livré avec anaconda ou miniconda: cela vous permettra deconda install
tous les outils dont vous avez besoin. -
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 pouranaconda/bin/python
. -
assurez-vous que vos noyaux Jupyter pointent vers le Les versions de Python que vous voulez utiliser. Lorsque vous
conda install jupyter
il devrait configurer ce pouranaconda/bin/python
automatiquement. Sinon, vous pouvez utiliser la commandejupyter kernelspec
oupython -m ipykernel install
pour ajuster les noyaux existants ou en installer de nouveaux. -
pour installer des modules dans d'autres noyaux Python Jupyter non gérés par Anaconda, vous devez copier le chemin vers 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!