Ce problème est assez simple à résoudre, mais il faut comprendre trois concepts différents :
- Comment utiliser Unix/Linux/OSX
$PATH
pour trouver les exécutables ( %PATH%
dans Windows)
- Comment Python installe et trouve les paquets
- 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 où 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 :
-
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.
-
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
.
-
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.
-
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 !
1 votes
Quelle est la trace complète de l'erreur ?