วิธีตั้งค่าตัวแปร env ในสมุดบันทึก Jupyter


93

ฉันมีปัญหาที่ Jupyter มองไม่เห็นตัวแปร env ในไฟล์ bashrc มีวิธีโหลดตัวแปรเหล่านี้ใน jupyter หรือเพิ่มตัวแปร custome เข้าไปได้หรือไม่

คำตอบ:


115

ในการตั้งค่าตัวแปร env ในสมุดบันทึก jupyter เพียงใช้ไฟล์ %คำสั่งมายากลอย่างใดอย่างหนึ่ง%envหรือ%set_envเช่นหรือ%env MY_VAR=MY_VALUE %env MY_VAR MY_VALUE(ใช้%envด้วยตัวเองเพื่อพิมพ์ตัวแปรสภาพแวดล้อมปัจจุบัน)

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


คุณลองใช้คำพูดหรือไม่? โปรดทราบว่าการเปลี่ยน os.environ ไม่เหมือนกัน - สามารถเปลี่ยนได้เฉพาะคำสั่ง (ในหน่วยความจำกระบวนการ python ปัจจุบัน) และไม่ได้ตั้งค่า OS env var อย่างแท้จริง (เช่นสำหรับคำสั่งที่ตามมา! shell)
michael

2
ฉันลบความคิดเห็นก่อนหน้านี้เนื่องจากไม่ถูกต้อง แต่โปรดทราบว่าคำสั่งเวทมนต์% env และ% set_env ใช้os.environ[var] = valในแบ็กเอนด์: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b

2
@michael มีวิธีใดบ้างที่จะรักษาสภาพแวดล้อมในโน้ตบุ๊กทั้งหมด การตั้งค่าสภาพแวดล้อมด้วยวิธีนี้ดูเหมือนจะคงอยู่เฉพาะสภาพแวดล้อมสำหรับโน้ตบุ๊กปัจจุบัน
James Wierzba

32

คุณยังสามารถตั้งค่าตัวแปรในkernel.jsonไฟล์ของคุณ:

วิธีแก้ปัญหาของฉันมีประโยชน์หากคุณต้องการตัวแปรสภาพแวดล้อมเดียวกันทุกครั้งที่คุณเริ่มต้นเคอร์เนล jupyter โดยเฉพาะอย่างยิ่งถ้าคุณมีตัวแปรสภาพแวดล้อมหลายชุดสำหรับงานที่แตกต่างกัน

ในการสร้างเคอร์เนล ipython ใหม่ด้วยตัวแปรสภาพแวดล้อมของคุณให้ทำดังต่อไปนี้:

  • อ่านเอกสารที่https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • เรียกใช้jupyter kernelspec listเพื่อดูรายการที่ติดตั้งเคอร์เนลและตำแหน่งที่จัดเก็บไฟล์
  • คัดลอกไดเร็กทอรีที่มี kernel.json (เช่นชื่อpython2) ไปยังไดเร็กทอรีใหม่ (เช่นpython2_myENV)
  • เปลี่ยนไฟล์display_nameใหม่kernel.json
  • เพิ่มenvพจนานุกรมที่กำหนดตัวแปรสภาพแวดล้อม

เคอร์เนล json ของคุณอาจมีลักษณะเช่นนี้ (ฉันไม่ได้แก้ไขอะไรเลยจาก kernel.json ที่ติดตั้งยกเว้นdisplay_nameและenv):

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

ใช้กรณีและข้อดีของแนวทางนี้

  • ในกรณีการใช้งานของฉันฉันต้องการตั้งค่าตัวแปรLD_LIBRARY_PATHที่มีผลต่อการโหลดโมดูลที่คอมไพล์ (เช่นเขียนด้วย C) การตั้งค่าตัวแปรนี้โดยใช้%set_envไม่ได้ผล
  • ฉันสามารถมีเมล็ดหลามหลายเมล็ดที่มีสภาพแวดล้อมต่างกัน
  • ในการเปลี่ยนสภาพแวดล้อมฉันต้องสลับ / รีสตาร์ทเคอร์เนลเท่านั้น แต่ฉันไม่ต้องรีสตาร์ทอินสแตนซ์ jupyter (มีประโยชน์ถ้าฉันไม่ต้องการหลวมตัวแปรในโน้ตบุ๊กเครื่องอื่น) ดู - อย่างไรก็ตาม - https://github.com/jupyter/notebook/issues/2647

คุณช่วยแนะนำฉันได้ไหมว่าฉันC:\Program Files (x86)\Graphviz2.38\bin\dot.exeจะเพิ่มเส้นทางระบบที่มีอยู่โดยใช้เทคนิคที่คุณแนะนำได้อย่างไร จะใช้งานได้หรือไม่ถ้าฉันไม่ได้ใช้บัญชีผู้ดูแลระบบ ฉันใช้ Windows 10
Khurram Majeed

สิ่งที่ฉันต้องการ Python ของ Homebrew จะเขียนทับsys.executableเว้นแต่PYTHONEXECUTABLEจะตั้งค่าไว้ล่วงหน้าซึ่งคุณต้องตั้งค่าก่อนที่ python จะทำงาน
Stefan Dragnev

ในความคิดของฉันนี่เป็นคำตอบเดียวที่ถูกต้องเนื่องจากใช้เฉพาะ Jupyter เท่านั้นแทนที่จะขึ้นอยู่กับฟังก์ชันการทำงานที่มีอยู่ในเคอร์เนลใด ๆ
shadowtalker

19

หากคุณกำลังใช้งูหลามคุณสามารถกำหนดตัวแปรสภาพแวดล้อมของคุณใน.envไฟล์และโหลดจากภายในโน้ตบุ๊ค Jupyter ใช้หลาม dotenv

ติดตั้ง python-dotenv:

pip install python-dotenv

โหลด.envไฟล์ในสมุดบันทึก Jupyter:

%load_ext dotenv
%dotenv

17

คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมในโค้ดของคุณได้ดังนี้:

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

แน่นอนว่าหากเป็นการแก้ไขชั่วคราวเพื่อให้ได้การแก้ไขแบบถาวรคุณอาจต้องส่งออกตัวแปรไปยัง~.profileข้อมูลเพิ่มเติมสามารถพบได้ที่นี่


2
ขอบคุณ Kardaj การส่งออกตัวแปรใน ~ / .profile แก้ไขได้ดูเหมือนว่ามันไม่ได้อ่านจาก bashrc ซึ่งค่อนข้างแปลก
Ehab AlBadawy

3
คำตอบของไมเคิล%env MY_VAR=MY_VALUEควรเป็นคำตอบที่ถูกต้องสำหรับคำถามนี้
สีดาโจว

@SidaZhou ทำไมคำตอบของ Michael ถึงดีกว่า?
พระองค์

2
@SidaZhou ขึ้นอยู่กับกรณีการใช้งาน - หากคุณต้องการให้เครดิตมีอยู่ใน env - และไม่ต้องการให้เครดิตอยู่ในสมุดบันทึกของคุณ (เช่นในการควบคุมแหล่งที่มา) สิ่งนี้ไม่เหมาะ
morganics

4

หากคุณจำเป็นต้องตั้งค่าตัวแปรก่อนที่คุณจะเริ่มต้นโน้ตบุ๊คเพียงการแก้ปัญหาที่ทำงานสำหรับฉันคือการenv VARIABLE=$VARIABLE jupyter notebookที่มีในexport VARIABLE=value.bashrc

ในกรณีของฉัน tensorflow ต้องการตัวแปรที่ส่งออกเพื่อให้นำเข้าในสมุดบันทึกได้สำเร็จ


2

gotcha ฉันพบ: สองคำสั่งต่อไปนี้เทียบเท่ากัน หมายเหตุแรกไม่สามารถใช้เครื่องหมายคำพูด ในทางตรงกันข้ามการอ้างสตริงเมื่อใช้%env VAR ...จะส่งผลให้อัญประกาศรวมเป็นส่วนหนึ่งของค่าของตัวแปรซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ

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

และ

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

1

หากคุณใช้ systemd ฉันเพิ่งพบว่าคุณต้องเพิ่มลงในไฟล์ systemd unit สิ่งนี้บน Ubuntu 16 การใส่ไว้ใน. profile และ. bashrc (แม้แต่ / etc / profile) ส่งผลให้ ENV Vars ไม่พร้อมใช้งานในโน้ตบุ๊ก juypter

ฉันต้องแก้ไข:

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

และใส่ตัวแปรที่ฉันต้องการอ่านในไฟล์หน่วยเช่น:

Environment=MYOWN_VAR=theVar

จากนั้นฉันก็สามารถอ่านมันได้จากในสมุดบันทึกของผู้เล่น


0

โซลูชันที่เกี่ยวข้อง (ระยะสั้น) คือการจัดเก็บตัวแปรสภาพแวดล้อมของคุณในไฟล์เดียวโดยมีรูปแบบที่คาดเดาได้ซึ่งสามารถหาที่มาได้เมื่อเริ่มต้นเทอร์มินัลและ / หรืออ่านลงในสมุดบันทึก ตัวอย่างเช่นฉันมีไฟล์.envที่มีข้อกำหนดตัวแปรสภาพแวดล้อมของฉันในรูปแบบVARIABLE_NAME=VARIABLE_VALUE(ไม่มีบรรทัดว่างหรือช่องว่างเพิ่มเติม) คุณสามารถซอร์สไฟล์นี้ในไฟล์.bashrcหรือ.bash_profileไฟล์เมื่อเริ่มเซสชันเทอร์มินัลใหม่และคุณสามารถอ่านสิ่งนี้ลงในสมุดบันทึกด้วยสิ่งต่างๆเช่น

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

ฉันใช้พา ธ สัมพัทธ์เพื่อแสดงว่า.envไฟล์นี้สามารถอยู่ได้ทุกที่และอ้างอิงโดยสัมพันธ์กับไดเร็กทอรีที่มีไฟล์โน้ตบุ๊ก นอกจากนี้ยังมีข้อดีของการไม่แสดงค่าตัวแปรภายในโค้ดของคุณที่ใดก็ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.