Cara menyetel variabel env di notebook Jupyter

92

Saya punya masalah bahwa Jupyter tidak dapat melihat variabel env di file bashrc, apakah ada cara untuk memuat variabel ini di jupyter atau menambahkan variabel custome ke dalamnya?

Ehab AlBadawy
sumber

Jawaban:

115

Untuk menyetel variabel env di notebook jupyter, cukup gunakan %perintah ajaib, baik %envatau %set_env, misalnya, %env MY_VAR=MY_VALUEatau %env MY_VAR MY_VALUE. (Gunakan %envdengan sendirinya untuk mencetak variabel lingkungan saat ini.)

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

michael
sumber
Sudahkah Anda mencoba kutipan? Perhatikan bahwa mengubah os.environ tidak sama - ia hanya dapat mengubah dikt itu (dalam memori, proses python saat ini), dan tidak secara harfiah menyetel OS env var (misalnya untuk perintah! Shell berikutnya).
michael
2
Saya menghapus komentar saya sebelumnya karena tidak cukup akurat - tetapi perhatikan bahwa perintah sihir% env dan% set_env digunakan os.environ[var] = valdi backend: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b
2
@michael Apakah ada cara untuk mempertahankan lingkungan di semua buku catatan? Pengaturan lingkungan dengan cara ini sepertinya hanya mempertahankan lingkungan untuk notebook saat ini.
James Wierzba
31

Anda juga dapat mengatur variabel di kernel.jsonfile Anda :

Solusi saya berguna jika Anda memerlukan variabel lingkungan yang sama setiap kali Anda memulai kernel jupyter, terutama jika Anda memiliki beberapa set variabel lingkungan untuk tugas yang berbeda.

Untuk membuat kernel ipython baru dengan variabel lingkungan Anda, lakukan hal berikut:

  • Baca dokumentasi di https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • Jalankan jupyter kernelspec listuntuk melihat daftar dengan kernel yang diinstal dan di mana file disimpan.
  • Salin direktori yang berisi kernel.json (misalnya bernama python2) ke direktori baru (misalnya python2_myENV).
  • Ubah display_namedi kernel.jsonfile baru .
  • Tambahkan envkamus yang mendefinisikan variabel lingkungan.

Kernel json Anda akan terlihat seperti ini (saya tidak mengubah apa pun dari kernel.json yang diinstal kecuali display_namedan env):

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

Gunakan kasus dan keuntungan dari pendekatan ini

  • Dalam kasus penggunaan saya, saya ingin mengatur variabel LD_LIBRARY_PATHyang mempengaruhi bagaimana modul yang dikompilasi (misalnya ditulis dalam C) dimuat. Menyetel variabel ini menggunakan %set_envtidak berhasil.
  • Saya dapat memiliki beberapa kernel python dengan lingkungan yang berbeda.
  • Untuk mengubah lingkungan, saya hanya perlu mengaktifkan / memulai ulang kernel, tetapi saya tidak perlu memulai ulang jupyter instance (berguna, jika saya tidak ingin kehilangan variabel di notebook lain). Lihat -bagaimanapun - https://github.com/jupyter/notebook/issues/2647
Bernhard
sumber
Bisakah Anda memberi tahu saya bagaimana cara menambahkan C:\Program Files (x86)\Graphviz2.38\bin\dot.exeke jalur sistem yang ada menggunakan teknik yang Anda sarankan? Apakah akan berhasil jika saya tidak menggunakan akun admin? Saya menggunakan Windows 10.
Khurram Majeed
Persis yang saya butuhkan. Python Homebrew menimpa sys.executablekecuali PYTHONEXECUTABLEdiatur sebelumnya, yang harus Anda atur sebelum python dijalankan.
Stefan Dragnev
Menurut pendapat saya, ini adalah satu - satunya jawaban yang benar, karena hanya menggunakan Jupyter itu sendiri, daripada bergantung pada fungsionalitas yang tersedia di kernel tertentu.
shadowtalker
19

Jika Anda menggunakan Python, Anda dapat menentukan variabel lingkungan Anda dalam sebuah .envfile dan memuatnya dari dalam notebook Jupyter menggunakan python-dotenv .

Instal python-dotenv:

pip install python-dotenv

Muat .envfile di notebook Jupyter:

%load_ext dotenv
%dotenv
aparkerlue
sumber
17

Anda dapat menyiapkan variabel lingkungan dalam kode Anda sebagai berikut:

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

Ini tentu saja merupakan perbaikan sementara, untuk mendapatkan yang permanen, Anda mungkin perlu mengekspor variabel ke Anda ~.profile, informasi lebih lanjut dapat ditemukan di sini

kardaj
sumber
2
Terima kasih Kardaj, mengekspor variabel di ~ / .profile menyelesaikannya, tampaknya itu tidak membaca dari bashrc yang agak aneh.
Ehab AlBadawy
3
jawaban michael dengan %env MY_VAR=MY_VALUEharus menjadi jawaban yang benar untuk pertanyaan ini
Sida Zhou
@SidaZhou kenapa jawaban michael lebih baik?
Dia
2
@SidaZhou bergantung pada kasus penggunaan - jika Anda ingin kredibilitas tersedia di env - dan tidak ingin kredibilitas ada di notebook Anda (misalnya pada kontrol sumber) maka ini tidak ideal.
morganics
4

Jika Anda memerlukan set variabel sebelum Anda memulai notebook, satu-satunya solusi yang berhasil untuk saya adalah env VARIABLE=$VARIABLE jupyter notebookdengan export VARIABLE=valuein .bashrc.

Dalam kasus saya, tensorflow memerlukan variabel yang diekspor agar berhasil mengimpornya di notebook.

Baschdl
sumber
2

Gotcha yang saya temui: Dua perintah berikut ini setara. Perhatikan bahwa yang pertama tidak dapat menggunakan tanda kutip. Agak berlawanan dengan intuisi, mengutip string saat menggunakan %env VAR ...akan menghasilkan tanda kutip yang disertakan sebagai bagian dari nilai variabel, yang mungkin bukan yang Anda inginkan.

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

dan

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

Jika Anda menggunakan systemd, saya baru tahu bahwa Anda tampaknya harus menambahkannya ke file unit systemd. Ini di Ubuntu 16. Menempatkannya ke .profile dan .bashrc (bahkan / etc / profile) mengakibatkan ENV Vars tidak tersedia di notebook juypter.

Saya harus mengedit:

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

dan masukkan variabel yang ingin saya baca di file unit seperti:

Environment=MYOWN_VAR=theVar

dan baru setelah itu saya dapat membacanya dari dalam notebook juypter.

Andy D
sumber
0

Solusi terkait (jangka pendek) adalah menyimpan variabel lingkungan Anda dalam satu file, dengan format yang dapat diprediksi, yang dapat bersumber saat memulai terminal dan / atau membaca ke dalam notebook. Misalnya, saya memiliki file ,, .envyang memiliki definisi variabel lingkungan saya dalam format VARIABLE_NAME=VARIABLE_VALUE(tidak ada baris kosong atau spasi ekstra). Anda dapat mengambil file ini di file .bashrcatau .bash_profileketika memulai sesi terminal baru dan Anda dapat membacanya menjadi buku catatan dengan sesuatu seperti,

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

Saya menggunakan jalur relatif untuk menunjukkan bahwa .envfile ini dapat hidup di mana saja dan direferensikan secara relatif ke direktori yang berisi file notebook. Ini juga memiliki keuntungan karena tidak menampilkan nilai variabel dalam kode Anda di mana pun.

wingr
sumber