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/pytho‌n3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌n3.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?!

28
demandé sur Matt 2016-08-18 02:06:12

1 réponses

c'est assez simple à résoudre, mais cela implique de comprendre trois concepts différents:

  1. Comment Unix/Linux/OSX utiliser $PATH pour trouver les exécutables ( %PATH% dans Windows)
  2. comment Python installe et trouve les paquets""
  3. 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 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:

  1. Paramétrez votre PATH de sorte que la version Python désirée soit la première. Par exemple, vous pouvez lancer export 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 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 le Les versions de Python que vous voulez utiliser. Lorsque vous conda install jupyter il devrait configurer ce pour anaconda/bin/python automatiquement. Sinon, vous pouvez utiliser la commande 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 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!

101
répondu jakevdp 2018-09-12 20:32:57