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


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


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

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

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


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.


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"

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.