Jak ustawić zmienną env w notatniku Jupyter

92

Mam problem z tym, że Jupyter nie widzi zmiennej env w pliku bashrc, czy istnieje sposób, aby załadować te zmienne w jupyter lub dodać do niego zmienną custome?

Ehab AlBadawy
źródło

Odpowiedzi:

115

Aby ustawić zmienną env w notatniku jupyter, po prostu użyj %magicznych poleceń, albo %envlub %set_env, na przykład, %env MY_VAR=MY_VALUEalbo %env MY_VAR MY_VALUE. (Użyj %envsamodzielnie, aby wydrukować aktualne zmienne środowiskowe.)

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

Michał
źródło
Czy po prostu próbowałeś cytatów? Zauważ, że zmiana os.environ nie jest tym samym - może zmienić tylko to (w pamięci, bieżący proces Pythona), i nie ustawia dosłownie zmiennej env systemu operacyjnego (np. Dla kolejnych poleceń powłoki).
michael
2
Usunąłem moje wcześniejsze komentarze, ponieważ nie były całkiem dokładne - ale zauważ, że magiczne polecenia% env i% set_env używają os.environ[var] = valna zapleczu: github.com/ipython/ipython/blob/master/IPython/core/magics/ ...
evan_b
2
@michael Czy istnieje sposób, aby zachować środowisko we wszystkich notebookach? Ustawienie środowiska w ten sposób wydaje się utrzymywać tylko środowisko dla bieżącego notebooka.
James Wierzba
30

Możesz także ustawić zmienne w swoim kernel.jsonpliku:

Moje rozwiązanie jest przydatne, jeśli potrzebujesz tych samych zmiennych środowiskowych za każdym razem, gdy uruchamiasz jądro jupyter, zwłaszcza jeśli masz wiele zestawów zmiennych środowiskowych do różnych zadań.

Aby utworzyć nowe jądro ipython ze zmiennymi środowiskowymi, wykonaj następujące czynności:

  • Przeczytaj dokumentację na https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • Uruchom, jupyter kernelspec listaby zobaczyć listę z zainstalowanymi jądrami i miejscem przechowywania plików.
  • Skopiuj katalog zawierający plik kernel.json (np. O nazwie python2) do nowego katalogu (np python2_myENV.).
  • Zmień display_namew nowym kernel.jsonpliku.
  • Dodaj envsłownik definiujący zmienne środowiskowe.

Twój json jądra mógłby wyglądać tak (nie modyfikowałem niczego z zainstalowanego kernel.json z wyjątkiem display_namei env):

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

Zastosuj przypadki i zalety tego podejścia

  • W moim przypadku chciałem ustawić zmienną, LD_LIBRARY_PATHktóra wpływa na sposób ładowania skompilowanych modułów (np. Napisanych w C). Ustawienie tej zmiennej za pomocą %set_envnie działa.
  • Mogę mieć wiele jąder Pythona w różnych środowiskach.
  • Aby zmienić środowisko, muszę tylko przełączyć / zrestartować jądro, ale nie muszę restartować instancji jupyter (przydatne, jeśli nie chcę zgubić zmiennych w innym notebooku). Zobacz - jednak - https://github.com/jupyter/notebook/issues/2647
Bernhard
źródło
Czy możesz mi doradzić, jak dodać C:\Program Files (x86)\Graphviz2.38\bin\dot.exedo istniejącej ścieżki systemowej za pomocą sugerowanej techniki? Czy to zadziała, jeśli nie używam konta administratora? Używam systemu Windows 10.
Khurram Majeed
Dokładnie to, czego potrzebowałem. Python Homebrew nadpisuje, sys.executablechyba że PYTHONEXECUTABLEjest ustawiony wcześniej, co musisz ustawić przed uruchomieniem Pythona.
Stefan Dragnev,
Moim zdaniem jest to jedyna poprawna odpowiedź, ponieważ używa tylko samego Jupytera, a nie zależy od funkcjonalności dostępnej w jakimkolwiek konkretnym jądrze.
shadowtalker
19

Jeśli używasz Pythona, możesz zdefiniować zmienne środowiskowe w .envpliku i załadować je z notatnika Jupyter za pomocą python-dotenv .

Zainstaluj python-dotenv:

pip install python-dotenv

Załaduj .envplik do notatnika Jupyter:

%load_ext dotenv
%dotenv
aparkerlue
źródło
17

Możesz ustawić zmienne środowiskowe w swoim kodzie w następujący sposób:

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

Jeśli oczywiście jest to tymczasowa poprawka, aby uzyskać stałą, prawdopodobnie będziesz musiał wyeksportować zmienne do swojego ~.profile, więcej informacji można znaleźć tutaj

kardaj
źródło
2
Dzięki Kardaj, wyeksportowanie zmiennej do ~ / .profile rozwiązało problem, wygląda na to, że nie czyta z bashrc, co jest trochę dziwne.
Ehab AlBadawy
3
odpowiedź Michaela z %env MY_VAR=MY_VALUEpowinna być poprawną odpowiedzią na to pytanie
Sida Zhou
@SidaZhou dlaczego odpowiedź Michaela jest lepsza?
On
2
@SidaZhou zależy od przypadku użycia - jeśli chcesz, aby kredyty były dostępne w środowisku env - i nie chcesz, aby były one w twoim notatniku (np. W kontroli źródła), to nie jest to idealne.
morganics
4

Jeśli potrzebujesz zmiennej zestaw zanim zaczynasz notebooka, jedynym rozwiązaniem, które pracował dla mnie było env VARIABLE=$VARIABLE jupyter notebookz export VARIABLE=valuew .bashrc.

W moim przypadku tensorflow potrzebuje wyeksportowanej zmiennej do pomyślnego zaimportowania jej do notatnika.

Baschdl
źródło
2

Problem, na który natknąłem się: Poniższe dwa polecenia są równoważne. Zauważ, że pierwszy nie może używać cudzysłowów. Nieco sprzecznie z intuicją, cytowanie łańcucha podczas używania %env VAR ...spowoduje, że cudzysłowy zostaną uwzględnione jako część wartości zmiennej, co prawdopodobnie nie jest tym, czego chcesz.

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

i

import os
os.environ['MYPATH'] = "C:/Folder Name/file.txt"
evan_b
źródło
1

Jeśli używasz systemd właśnie dowiedziałem się, że musisz dodać je do pliku jednostki systemd. To na Ubuntu 16. Umieszczenie ich w plikach .profile i .bashrc (nawet w / etc / profile) spowodowało, że zmienne ENV nie były dostępne w notebookach juypter.

Musiałem edytować:

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

i wstawiłem zmienną, którą chciałem przeczytać w pliku jednostkowym, na przykład:

Environment=MYOWN_VAR=theVar

i dopiero wtedy mogłem go przeczytać z zeszytu Juypter.

Andy D.
źródło
0

Powiązane (krótkoterminowe) rozwiązanie polega na przechowywaniu zmiennych środowiskowych w jednym pliku w przewidywalnym formacie, który można pobrać podczas uruchamiania terminala i / lub wczytywania do notatnika. Na przykład mam plik, .envktóry ma moje definicje zmiennych środowiskowych w formacie VARIABLE_NAME=VARIABLE_VALUE(bez pustych wierszy lub dodatkowych spacji). Możesz pobrać ten plik w plikach .bashrclub .bash_profilepodczas rozpoczynania nowej sesji terminala i możesz wczytać go do notatnika za pomocą czegoś takiego jak:

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

Użyłem ścieżki względnej, aby pokazać, że ten .envplik może znajdować się w dowolnym miejscu i być powiązany z katalogiem zawierającym plik notatnika. Ma to również tę zaletę, że nigdzie nie wyświetla wartości zmiennych w kodzie.

wingr
źródło