So legen Sie die env-Variable im Jupyter-Notizbuch fest

90

Ich habe ein Problem, dass Jupyter die env-Variable in der bashrc-Datei nicht sehen kann. Gibt es eine Möglichkeit, diese Variablen in jupyter zu laden oder eine custome-Variable hinzuzufügen?

Ehab AlBadawy
quelle

Antworten:

112

Um eine env-Variable in einem Jupyter-Notizbuch festzulegen, verwenden Sie einfach einen %magischen Befehl , entweder %envoder %set_env, z . B. %env MY_VAR=MY_VALUEoder %env MY_VAR MY_VALUE. (Verwenden%env diese Option, um aktuelle Umgebungsvariablen auszudrucken.)

Siehe: http://ipython.readthedocs.io/en/stable/interactive/magics.html

Michael
quelle
Haben Sie einfach Zitate ausprobiert? Beachten Sie, dass das Ändern der os.environ nicht dasselbe ist - es kann nur das (im Speicher, aktuelle Python-Prozess) Diktat ändern und legt nicht buchstäblich eine OS-Umgebungsvariable fest (z. B. für nachfolgende! Shell-Befehle).
Michael
2
Ich habe meine früheren Kommentare gelöscht, da sie nicht ganz korrekt waren. Beachten Sie jedoch, dass die magischen Befehle% env und% set_env os.environ[var] = valim Backend verwendet werden: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b
2
@michael Gibt es eine Möglichkeit, die Umgebung über alle Notebooks hinweg zu erhalten? Wenn Sie die Umgebung auf diese Weise einstellen, bleibt die Umgebung nur für das aktuelle Notebook erhalten.
James Wierzba
29

Sie können auch die Variablen in Ihrer kernel.jsonDatei festlegen :

Meine Lösung ist nützlich, wenn Sie jedes Mal, wenn Sie einen Jupyter-Kernel starten, dieselben Umgebungsvariablen benötigen, insbesondere wenn Sie mehrere Sätze von Umgebungsvariablen für verschiedene Aufgaben haben.

Gehen Sie wie folgt vor, um einen neuen Ipython-Kernel mit Ihren Umgebungsvariablen zu erstellen:

  • Lesen Sie die Dokumentation unter https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • Führen Sie diese aus jupyter kernelspec list, um eine Liste mit installierten Kerneln und dem Speicherort der Dateien anzuzeigen.
  • Kopieren Sie das Verzeichnis, das die Datei kernel.json enthält (z. B. benannt python2), in ein neues Verzeichnis (z python2_myENV. B. ).
  • Ändern Sie die display_namein der neuen kernel.jsonDatei.
  • Fügen Sie ein envWörterbuch hinzu, das die Umgebungsvariablen definiert.

Ihr Kernel-JSON könnte so aussehen (ich habe nichts an der installierten Datei kernel.json geändert, außer display_nameund env):

{
 "display_name": "Python 2 with environment",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "env": {"LD_LIBRARY_PATH":""}
}

Anwendungsfälle und Vorteile dieses Ansatzes

  • In meinem Anwendungsfall wollte ich die Variable festlegen, die sich auf LD_LIBRARY_PATHdas Laden kompilierter Module (z. B. in C geschrieben) auswirkt. Das Einstellen dieser Variablen mit %set_envhat nicht funktioniert.
  • Ich kann mehrere Python-Kernel mit unterschiedlichen Umgebungen haben.
  • Um die Umgebung zu ändern, muss ich nur den Kernel wechseln / neu starten, aber ich muss die Jupyter-Instanz nicht neu starten (nützlich, wenn ich die Variablen in einem anderen Notizbuch nicht verlieren möchte). Siehe jedoch - https://github.com/jupyter/notebook/issues/2647
Bernhard
quelle
Können Sie mir bitte mitteilen, wie ich C:\Program Files (x86)\Graphviz2.38\bin\dot.exemithilfe Ihrer vorgeschlagenen Technik den vorhandenen Systempfad ergänzen kann? Funktioniert es, wenn ich kein Administratorkonto verwende? Ich benutze Windows 10.
Khurram Majeed
Genau das, was ich brauchte. Python von Homebrew überschreibt, sys.executablees PYTHONEXECUTABLEsei denn, es wurde zuvor festgelegt, was Sie festlegen müssen, bevor Python ausgeführt wird.
Stefan Dragnev
Meiner Meinung nach ist dies die einzig richtige Antwort, da nur Jupyter selbst verwendet wird und nicht von der Funktionalität abhängt, die in einem bestimmten Kernel verfügbar ist.
Shadowtalker
18

Wenn Sie Python verwenden, können Sie Ihre Umgebungsvariablen in einer .envDatei definieren und mit python-dotenv aus einem Jupyter-Notizbuch laden .

Installieren Sie python-dotenv:

pip install python-dotenv

Laden Sie die .envDatei in ein Jupyter-Notizbuch:

%load_ext dotenv
%dotenv
aparkerlue
quelle
17

Sie können Umgebungsvariablen in Ihrem Code wie folgt einrichten:

import sys,os,os.path
sys.path.append(os.path.expanduser('~/code/eol_hsrl_python'))
os.environ['HSRL_INSTRUMENT']='gvhsrl'
os.environ['HSRL_CONFIG']=os.path.expanduser('~/hsrl_config')

Wenn dies natürlich eine vorübergehende Korrektur ist, müssen Sie wahrscheinlich die Variablen in Ihre exportieren, um eine dauerhafte zu erhalten. ~.profileWeitere Informationen finden Sie hier

kardaj
quelle
2
Dank Kardaj, der Export der Variablen in ~ / .profile hat es gelöst, scheint es nicht aus bashrc zu lesen, was irgendwie komisch ist.
Ehab AlBadawy
3
Michaels Antwort mit %env MY_VAR=MY_VALUEsollte die richtige Antwort auf diese Frage sein
Sida Zhou
@SidaZhou warum ist Michaels Antwort besser?
Scott
2
@SidaZhou hängt vom Anwendungsfall ab - wenn Sie möchten, dass Creds in env verfügbar sind - und nicht, dass Creds in Ihrem Notebook enthalten sind (z. B. von der Quellcodeverwaltung), ist dies nicht ideal.
Morganics
3

Wenn Sie den Variablensatz benötigen, bevor Sie das Notebook starten, war die einzige Lösung, die für mich funktioniert hat, env VARIABLE=$VARIABLE jupyter notebookmit export VARIABLE=valuein .bashrc.

In meinem Fall benötigt Tensorflow die exportierte Variable, um sie erfolgreich in ein Notizbuch zu importieren.

Baschdl
quelle
2

Ein Fall, auf den ich gestoßen bin: Die folgenden zwei Befehle sind äquivalent. Beachten Sie, dass der erste keine Anführungszeichen verwenden kann. Etwas kontraintuitiv führt das Zitieren der Zeichenfolge bei der Verwendung %env VAR ...dazu, dass die Anführungszeichen als Teil des Variablenwerts enthalten sind, was wahrscheinlich nicht das ist, was Sie wollen.

%env MYPATH=C:/Folder Name/file.txt

und

import os
os.environ['MYPATH'] = "C:/Folder Name/file.txt"
evan_b
quelle
1

Wenn Sie systemd verwenden, habe ich gerade herausgefunden, dass Sie sie anscheinend zur systemd-Einheitendatei hinzufügen müssen. Dies unter Ubuntu 16. Das Einfügen in .profile und .bashrc (sogar in das / etc / profile) führte dazu, dass die ENV-Vars in den Juypter-Notebooks nicht verfügbar waren.

Ich musste bearbeiten:

/lib/systemd/system/jupyer-notebook.service

und geben Sie die Variable ein, die ich in die Einheitendatei einlesen wollte, wie:

Environment=MYOWN_VAR=theVar

und nur dann konnte ich es aus einem Juypter-Notizbuch heraus lesen.

Andy D.
quelle
0

Eine verwandte (kurzfristige) Lösung besteht darin, Ihre Umgebungsvariablen in einer einzigen Datei mit einem vorhersehbaren Format zu speichern, das beim Starten eines Terminals bezogen und / oder in das Notizbuch eingelesen werden kann. Zum Beispiel habe ich eine Datei, .envdie meine Umgebungsvariablendefinitionen im Format hat VARIABLE_NAME=VARIABLE_VALUE(keine Leerzeilen oder zusätzliche Leerzeichen). Sie können diese Datei in den Dateien .bashrcoder zu .bash_profileBeginn einer neuen Terminalsitzung als Quelle verwenden und diese in ein Notizbuch mit folgenden Informationen einlesen:

import os
env_vars = !cat ../script/.env
for var in env_vars:
    key, value = var.split('=')
    os.environ[key] = value

Ich habe einen relativen Pfad verwendet, um zu zeigen, dass diese .envDatei überall leben und relativ zu dem Verzeichnis referenziert werden kann, das die Notebook-Datei enthält. Dies hat auch den Vorteil, dass die Variablenwerte in Ihrem Code nirgendwo angezeigt werden.

wingr
quelle