web-dev-qa-db-fra.com

Exécuter Jupyter avec plusieurs Python et chemins IPython

J'aimerais travailler avec les ordinateurs portables Jupyter, mais j'ai des difficultés à importer des produits de base (comme import matplotlib). Je pense que c’est parce que j’ai plusieurs installations gérées par l'utilisateur python. 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 enlevé si du répertoire ~/anaconda. Maintenant, quand je démarre un cahier Jupyter, je reçois 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 devrais-je faire?!

37
npross

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

  1. Comment Unix/Linux/OSX utilise $PATH Pour trouver des exécutables (%PATH% Sous Windows)
  2. Comment Python installe et trouve des paquets
  3. Comment Jupyter sait quoi utiliser Python

Par souci d’exhaustivité, je vais essayer d’élaborer rapidement un ELI5 sur chacun d’entre eux afin que vous sachiez résoudre ce problème de la meilleure façon qui soit.

1. Unix/Linux/OSX $ PATH

Lorsque vous tapez une commande à l'invite (par exemple, python), le système dispose d'une séquence d'emplacements bien définie pour laquelle il recherche 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é. 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 les fenêtres echo %path%

Probablement avec quelques autres chemins entrecoupés aussi. Cela signifie que lorsque vous tapez python, le système passe à /usr/bin/python. Lorsque vous tapez ipython, dans cet exemple, le système passera à /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython, Car 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 définitivement $ PATH sur Linux? .

Windows - Comment définir des variables d'environnement dans Windows 1

2. Comment Python trouve les paquets

Lorsque vous exécutez python et que vous faites quelque chose comme import matplotlib, Python doit jouer à un jeu similaire pour trouver le paquet que vous avez à l'esprit. Similaire to $PATH sous unix, Python a sys.path qui 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 de sys.path Est le répertoire actuel. De plus, à moins que vous ne modifiiez cela (ce que vous ne devriez pas faire sauf si vous savez exactement ce que vous faites), vous trouverez généralement quelque chose appelé site-packages Dans le chemin: c'est l'endroit par défaut Python place les packages lorsque vous les installez à l’aide de python setup.py install, Ou pip, ou conda, ou un moyen similaire.

La chose importante à noter est que chaque python) installation a son propre site-packages , où les packages sont installés pour cette version spécifique Python version . En d'autres termes, si vous installez quelque chose pour, par exemple, /usr/bin/python, alors ~/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é concentrez-vous sur une installation Python) et corrigez votre $PATH afin que vous n'utilisiez que celle que vous souhaitez utiliser.

Il existe un autre composant à cela: certains Python sont livrés avec des scripts autonomes que vous pouvez exécuter depuis la ligne de commande (les exemples sont 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 est conçu pour fonctionner uniquement avec cela Python installation .

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 version à /Library/Frameworks/Python.framework/Versions/3.5/bin/python!! En outre, cela signifie que les packages que vous pouvez importer lors de l'exécution de python sont entièrement distincts de ceux que vous pouvez utiliser. importer lorsque vous exécutez ipython ou un bloc-notes Jupyter: vous utilisez deux installations totalement indépendantes Python installations.

Alors, comment réparer ça? Bien, assurez-vous d’abord 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 cette variable $PATH. Sous Windows, vous pouvez modifier les variables d'environnement spécifiques à l'utilisateur. Vous pouvez le modifier manuellement si vous souhaitez que votre système recherche les éléments dans un ordre différent. Lorsque vous installez anaconda/miniconda pour la première fois, une option vous le permet automatiquement (ajoutez Python au PATH): dites oui à cela, puis python indiquera toujours à ~/anaconda/python, ce qui est probablement ce que vous voulez.

3. Comment Jupyter sait quoi utiliser Python

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

Jupyter est configuré pour pouvoir utiliser une large gamme de "noyaux" ou de moteurs d'exécution pour le code. Celles-ci peuvent être Python 2, Python 3, R, Julia, Ruby ... il y a des dizaines de noyaux possibles à utiliser. Mais pour cela, Jupyter doit savoir pour rechercher l’exécutable associé: c’est-à-dire qu’il doit savoir dans quel chemin se trouve python.

Ces chemins sont spécifiés dans kernelspec de jupyter, et il est possible pour l'utilisateur de les ajuster à leurs 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 de ces répertoires est un répertoire contenant des métadonnées qui spécifient le nom du noyau, le chemin d'accès à l'exécutable et d'autres informations pertinentes.
Vous pouvez ajuster les noyaux manuellement en modifiant les métadonnées contenues dans les répertoires répertoriés ci-dessus.

La commande pour installer un noyau peut changer en fonction du noyau. IPython repose sur le paquet ipykernel qui contient une commande pour installer un noyau python: par exemple)

$  python -m ipykernel install

Il créera un fichier kernelspec associé à l'exécutable Python que vous utiliserez pour exécuter cette commande. Vous pourrez alors choisir ce noyau dans le bloc-notes Jupyter pour exécuter votre code avec ce Python.

Vous pouvez voir d'autres options fournies par ipykernel à l'aide de 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ée avec une extension pour le notebook qui doit automatiquement détecter vos divers environnements de conda si le package ipykernel est installé.

Conclusion: résoudre votre problème

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

  1. Définissez votre PATH de sorte que la version désirée Python soit la première. Par exemple, vous pouvez exécuter export PATH="/path/to/python/bin:$PATH" Pour spécifier (une fois) laquelle Python que vous souhaitez utiliser. Pour le faire de façon permanente, ajoutez cette ligne à votre .bash_profile/.bashrc (Notez que anaconda peut le faire automatiquement pour vous lors de son installation). Je recommanderais 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 packages que vous souhaitez 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 Python que vous voulez utiliser. Lorsque vous conda install jupyter, Vous devez le configurer automatiquement pour anaconda/bin/python. Sinon, vous pouvez utilisez 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 Python noyaux Jupyter non gérés par Anaconda, vous devez copier le chemin d'accès à l'exécutable Python du noyau et exécuter /path/to/python -m pip install <package>

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

127
jakevdp