Ich würde gerne mit Jupyter-Notebooks arbeiten, hatte jedoch Schwierigkeiten, grundlegende Importe durchzuführen (z. B. Import matplotlib). Ich glaube, das lag daran, dass ich mehrere benutzerverwaltete python installationen habe. Zum Beispiel:
> 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
Früher hatte ich Anaconda, wurde aber aus dem ~/anaconda-Verzeichnis entfernt. Wenn ich jetzt ein Jupyter Notebook starte, bekomme ich einen Kernelfehler:
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'
Was sollte ich tun?!
Dies ist relativ einfach zu beheben, erfordert jedoch das Verständnis von drei verschiedenen Konzepten:
$PATH
Verwendet, um ausführbare Dateien zu finden (%PATH%
In Windows)Der Vollständigkeit halber werde ich versuchen, jeweils eine kurze ELI5-Analyse durchzuführen, damit Sie wissen, wie Sie dieses Problem am besten lösen können.
Wenn Sie einen Befehl an der Eingabeaufforderung eingeben (z. B. python
), hat das System eine genau definierte Abfolge von Stellen, an denen es nach der ausführbaren Datei sucht. Diese Sequenz ist in einer Systemvariablen namens PATH
definiert, die der Benutzer angeben kann. Um Ihr PATH
anzuzeigen, können Sie echo $PATH
Eingeben.
Das Ergebnis ist eine Liste von Verzeichnissen auf Ihrem Computer, die durchsucht werden in der Reihenfolge nach der gewünschten ausführbaren Datei. Aus Ihrer obigen Ausgabe gehe ich davon aus, dass es Folgendes enthält:
$ echo $PATH
/usr/bin/:/Library/Frameworks/Python.framework/Versions/3.5/bin/:/usr/local/bin/
In Windows echo %path%
Wahrscheinlich auch mit einigen anderen Pfaden. Dies bedeutet, dass das System bei der Eingabe von python
zu /usr/bin/python
Wechselt. Wenn Sie in diesem Beispiel ipython
eingeben, wechselt das System zu /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
, Da in /usr/bin/
Kein ipython
vorhanden ist.
Es ist immer wichtig zu wissen, welche ausführbare Datei Sie verwenden, insbesondere wenn Sie so viele Installationen desselben Programms auf Ihrem System haben. Das Ändern des Pfades ist nicht zu kompliziert. siehe z. Wie setze ich $ PATH dauerhaft unter Linux? .
Windows - Festlegen von Umgebungsvariablen in Windows 1
Wenn Sie python und so etwas wie import matplotlib
Ausführen, muss Python ein ähnliches Spiel spielen, um das gewünschte Paket zu finden zu $PATH
in Unix, Python hat sys.path
das diese angibt:
$ python
>>> import sys
>>> sys.path
['',
'/Users/jakevdp/anaconda/lib/python3.5',
'/Users/jakevdp/anaconda/lib/python3.5/site-packages',
...]
Einige wichtige Dinge: Standardmäßig ist der erste Eintrag in sys.path
Das aktuelle Verzeichnis. Wenn Sie dies nicht ändern (was Sie nicht tun sollten, wenn Sie nicht genau wissen, was Sie tun), finden Sie normalerweise etwas mit dem Namen site-packages
Im Pfad: Dies ist der Standardort, an dem Python legt Pakete ab, wenn Sie sie mit python setup.py install
Oder pip
oder conda
oder einem ähnlichen Verfahren installieren.
Das Wichtigste ist, dass jede python installation hat ihre eigenen site-pakete, wobei pakete installiert werden für dieses spezifische Python version. Mit anderen Worten, wenn Sie etwas für zB /usr/bin/python
installieren, dann ~/anaconda/bin/python
kann dieses Paket nicht verwenden, weil es wurde auf einem anderen Python installiert! Aus diesem Grund habe ich in unserem Twitter-Austausch empfohlen, dass Sie sich auf eine Python Installation) konzentrieren und Ihren $PATH
so korrigieren, dass Sie nur die eine verwenden du willst benutzen.
Es gibt noch eine weitere Komponente: Einige Python Pakete werden mit eigenständigen Skripten geliefert, die Sie über die Befehlszeile ausführen können (Beispiele sind pip
, ipython
, jupyter
, pep8
usw.) Standardmäßig werden diese ausführbaren Dateien in das Verzeichnis derselbe Verzeichnispfad gestellt, der auch für Python verwendet wird um sie zu installieren und funktionieren nur mit der Python Installation.
Das heißt, wenn Sie python
ausführen, während Ihr System eingerichtet ist, erhalten Sie /usr/bin/python
, Aber wenn Sie ipython
ausführen, erhalten Sie /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
Dies ist mit der Python Version unter /Library/Frameworks/Python.framework/Versions/3.5/bin/python
verknüpft! Außerdem bedeutet dies, dass die Pakete, die Sie importieren können, wenn Sie python
ausführen, völlig unabhängig von den Paketen sind, die Sie können Importieren, wenn Sie ipython
oder ein Jupyter-Notizbuch ausführen: Sie verwenden zwei völlig unabhängige Python) - Installationen.
Wie kann das behoben werden? Stellen Sie zunächst sicher, dass Ihre Variable $PATH
Das tut, was Sie möchten. Sie haben wahrscheinlich ein Startskript mit dem Namen ~/.bash_profile
Oder ~/.bashrc
, Mit dem diese Variable $PATH
Festgelegt wird. Unter Windows können Sie die benutzerspezifischen Umgebungsvariablen ändern. Sie können dies manuell ändern, wenn Ihr System die Suche in einer anderen Reihenfolge durchführen soll. Wenn Sie anaconda/miniconda zum ersten Mal installieren, gibt es eine Option, die dies automatisch ausführt (fügen Sie Python zum PFAD hinzu): Sagen Sie dazu Ja, und dann zeigt python
immer auf ~/anaconda/python
, was Sie wahrscheinlich wollen.
Wir sind noch nicht ganz aus dem Wasser. Sie haben erwähnt, dass im Jupyter-Notizbuch eine Kernel-Fehlermeldung angezeigt wird: Dies weist darauf hin, dass Jupyter nach einer nicht vorhandenen Python) -Version sucht.
Jupyter ist so eingerichtet, dass es eine Vielzahl von "Kerneln" oder Ausführungs-Engines für den Code verwenden kann. Dies können sein Python 2, Python 3, R, Julia, Ruby ... Es gibt Dutzende möglicher Kernel, die verwendet werden können passieren, muss Jupyter wissen, wo um nach der zugehörigen ausführbaren Datei zu suchen: das heißt, es muss wissen, in welchem Pfad sich das python
befindet.
Diese Pfade werden in jupyters kernelspec
angegeben, und der Benutzer kann sie an seine Wünsche anpassen. Zum Beispiel ist hier die Liste der Kernel, die ich auf meinem System habe:
$ 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
Jedes dieser Verzeichnisse enthält Metadaten, die den Namen des Kernels, den Pfad zur ausführbaren Datei und andere relevante Informationen enthalten.
Sie können den Kernel manuell anpassen, indem Sie die Metadaten in den oben aufgeführten Verzeichnissen bearbeiten.
Der Befehl zum Installieren eines Kernels kann sich je nach Kernel ändern. IPython stützt sich auf das ipykernel-Paket , das einen Befehl zum Installieren eines python kernel: zum Beispiel enthält
$ python -m ipykernel install
Es wird eine Kernelspezifikation erstellt, die der ausführbaren Datei Python verwendet wird, um diesen Befehl auszuführen. Anschließend können Sie diesen Kernel im Jupyter-Notizbuch auswählen, um Ihren Code mit diesem Python auszuführen.
Mit dem Befehl help können Sie andere Optionen anzeigen, die ipykernel bereitstellt:
$ 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.
Hinweis: Die neueste Version von anaconda wird mit einer Erweiterung für das Notebook ausgeliefert, die Ihre verschiedenen Conda-Umgebungen automatisch erkennt, wenn das Paket ipykernel
darin installiert ist.
Vor diesem Hintergrund lässt sich Ihr Problem ganz einfach beheben:
Stellen Sie Ihr PATH
so ein, dass die gewünschte Python Version an erster Stelle steht. Sie können beispielsweise export PATH="/path/to/python/bin:$PATH"
Ausführen, um (einmalig) anzugeben, welches Python, das Sie verwenden möchten. Fügen Sie dazu diese Zeile dauerhaft zu Ihrem .bash_profile
/.bashrc
Hinzu (beachten Sie, dass Anaconda dies automatisch für Sie tun kann, wenn Sie es installieren). Ich würde empfehlen, Python zu verwenden, das mit Anaconda oder Miniconda geliefert wird. Auf diese Weise können Sie conda install
Alle Tools verwenden, die Sie benötigen.
Stellen Sie sicher, dass die Pakete, die Sie verwenden möchten, für that Python installiert sind. Wenn Sie conda verwenden, können Sie z. conda install jupyter matplotlib scikit-learn
, Um diese Pakete für anaconda/bin/python
Zu installieren.
Stellen Sie sicher, dass Ihr Jupyter-Kernel auf die zu verwendenden Python) -Versionen verweist. Wenn Sie conda install jupyter
Auswählen, sollte dies automatisch für anaconda/bin/python
Eingerichtet werden. Andernfalls können Sie Verwenden Sie den Befehl jupyter kernelspec
oder den Befehl python -m ipykernel install
, um vorhandene Kernel anzupassen oder neue zu installieren.
Um Module in andere Python Jupyter-Kernel zu installieren, die nicht von Anaconda verwaltet werden, müssen Sie den Pfad zur Python ausführbaren Datei für den Kernel kopieren und /path/to/python -m pip install <package>
Hoffentlich ist das klar ... viel Glück!