wake-up-neo.com

Ausführen von Jupyter mit mehreren Python und IPython-Pfaden

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/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' 

Was sollte ich tun?!

37
npross

Dies ist relativ einfach zu beheben, erfordert jedoch das Verständnis von drei verschiedenen Konzepten:

  1. Wie Unix/Linux/OSX $PATH Verwendet, um ausführbare Dateien zu finden (%PATH% In Windows)
  2. Wie Python installiert und findet Pakete
  3. Woher weiß Jupyter, was Python zu verwenden ist?

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.

1. Unix/Linux/OSX $ PATH

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

2. Wie Python Pakete findet

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/pythonkann 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.

3. Woher weiß Jupyter, was Python zu verwenden ist?

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.

Zusammenfassung: Beheben Sie Ihr Problem

Vor diesem Hintergrund lässt sich Ihr Problem ganz einfach beheben:

  1. 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.

  2. 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.

  3. 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.

  4. 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!

127
jakevdp