Cách đặt biến env trong sổ ghi chép Jupyter


Câu trả lời:


115

Để đặt một biến env trong sổ ghi chép jupyter, chỉ cần sử dụng %lệnh ma thuật, hoặc %envhoặc %set_env, ví dụ: %env MY_VAR=MY_VALUEhoặc %env MY_VAR MY_VALUE. (Sử dụng %envchính nó để in ra các biến môi trường hiện tại.)

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


Bạn đã thử trích dẫn đơn giản chưa? Lưu ý rằng việc thay đổi os.environ không giống nhau - nó chỉ có thể thay đổi dict đó (trong bộ nhớ, quy trình python hiện tại) và không thiết lập một hệ điều hành env var theo nghĩa đen (ví dụ: đối với các lệnh tiếp theo! Shell).
michael

2
Tôi đã xóa các nhận xét trước đó của mình vì chúng không hoàn toàn chính xác - nhưng lưu ý rằng các lệnh ma thuật% env và% set_env sử dụng os.environ[var] = valtrên phụ trợ: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b

2
@michael Có cách nào để duy trì môi trường trên tất cả các sổ ghi chép không? Đặt môi trường theo cách này dường như chỉ duy trì môi trường cho sổ ghi chép hiện tại.
James Wierzba

32

Bạn cũng có thể đặt các biến trong kernel.jsontệp của mình :

Giải pháp của tôi rất hữu ích nếu bạn cần các biến môi trường giống nhau mỗi khi khởi động nhân jupyter, đặc biệt nếu bạn có nhiều bộ biến môi trường cho các tác vụ khác nhau.

Để tạo một hạt nhân ipython mới với các biến môi trường của bạn, hãy làm như sau:

  • Đọc tài liệu tại https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • Chạy jupyter kernelspec listđể xem danh sách có các hạt nhân đã cài đặt và nơi các tệp được lưu trữ.
  • Sao chép thư mục chứa kernel.json (ví dụ có tên python2) sang một thư mục mới (ví dụ python2_myENV).
  • Thay đổi display_nametrong kernel.jsontệp mới .
  • Thêm envtừ điển xác định các biến môi trường.

Kernel json của bạn có thể trông như thế này (Tôi không sửa đổi bất cứ thứ gì từ kernel.json đã cài đặt ngoại trừ display_nameenv):

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

Các trường hợp sử dụng và ưu điểm của phương pháp này

  • Trong trường hợp sử dụng của tôi, tôi muốn đặt biến LD_LIBRARY_PATHảnh hưởng đến cách tải các mô-đun đã biên dịch (ví dụ: được viết bằng C). Đặt biến này bằng cách sử dụng %set_envkhông hoạt động.
  • Tôi có thể có nhiều hạt nhân python với các môi trường khác nhau.
  • Để thay đổi môi trường, tôi chỉ phải chuyển đổi / khởi động lại hạt nhân, nhưng tôi không phải khởi động lại cá thể jupyter (hữu ích, nếu tôi không muốn mất các biến trong sổ ghi chép khác). Xem -however - https://github.com/jupyter/notebook/issues/2647

Bạn có thể vui lòng tư vấn cho tôi làm cách nào để thêm C:\Program Files (x86)\Graphviz2.38\bin\dot.exevào đường dẫn hệ thống hiện có bằng kỹ thuật đề xuất của bạn không? Nó sẽ hoạt động nếu tôi không sử dụng tài khoản quản trị viên? Tôi đang sử dụng Windows 10.
Khurram Majeed

Chính xác những gì tôi cần. Homebrew's Python sẽ ghi đè sys.executabletrừ khi PYTHONEXECUTABLEđược đặt trước, điều này bạn phải đặt trước khi python chạy.
Stefan Dragnev

Theo tôi, đây là câu trả lời đúng duy nhất , vì nó chỉ sử dụng bản thân Jupyter, thay vì phụ thuộc vào chức năng có sẵn trong bất kỳ hạt nhân cụ thể nào.
shadowtalker

19

Nếu đang sử dụng Python, bạn có thể xác định các biến môi trường của mình trong một .envtệp và tải chúng từ trong sổ ghi chép Jupyter bằng python-dotenv .

Cài đặt python-dotenv:

pip install python-dotenv

Tải .envtệp vào sổ ghi chép Jupyter:

%load_ext dotenv
%dotenv

17

Bạn có thể thiết lập các biến môi trường trong mã của mình như sau:

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

Tất nhiên, đây là bản sửa lỗi tạm thời, để có được một bản sửa chữa vĩnh viễn, bạn có thể cần xuất các biến vào của mình ~.profile, bạn có thể tìm thêm thông tin tại đây


2
Cảm ơn Kardaj, việc xuất biến trong ~ / .profile đã giải quyết được nó, có vẻ như nó không đọc từ bashrc, điều này hơi kỳ lạ.
Ehab AlBadawy

3
câu trả lời michael với %env MY_VAR=MY_VALUEphải là câu trả lời đúng cho câu hỏi này
Sida Zhou

@SidaZhou tại sao câu trả lời của michael lại tốt hơn?
ấy

2
@SidaZhou phụ thuộc vào trường hợp sử dụng - nếu bạn muốn tín dụng có sẵn trong env - và không muốn tín dụng nằm trong sổ ghi chép của bạn (ví dụ: kiểm soát nguồn) thì điều này không lý tưởng.
morganics

4

Nếu bạn cần thiết lập biến trước khi bạn bắt đầu máy tính xách tay, giải pháp duy nhất mà làm việc đối với tôi là env VARIABLE=$VARIABLE jupyter notebookvới export VARIABLE=valuetrong .bashrc.

Trong trường hợp của tôi, tensorflow cần biến đã xuất để nhập thành công vào sổ ghi chép.


2

Một vấn đề tôi gặp phải: Hai lệnh sau là tương đương. Lưu ý đầu tiên không thể sử dụng dấu ngoặc kép. Nói cách khác, trích dẫn chuỗi khi sử dụng %env VAR ...sẽ dẫn đến việc các dấu ngoặc kép được bao gồm như một phần giá trị của biến, điều này có thể không phải là điều bạn muốn.

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

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

1

Nếu bạn đang sử dụng systemd, tôi vừa phát hiện ra rằng bạn dường như phải thêm chúng vào tệp đơn vị systemd. Điều này trên Ubuntu 16. Việc đưa chúng vào .profile và .bashrc (thậm chí là / etc / profile) dẫn đến các ENV Vars không khả dụng trong sổ ghi chép juypter.

Tôi đã phải chỉnh sửa:

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

và đặt biến tôi muốn đọc trong tệp đơn vị như:

Environment=MYOWN_VAR=theVar

và chỉ sau đó tôi mới có thể đọc nó từ trong sổ tay juypter.


0

Một giải pháp liên quan (ngắn hạn) là lưu trữ các biến môi trường của bạn trong một tệp duy nhất, với định dạng có thể dự đoán được, có thể được lấy ra khi khởi động thiết bị đầu cuối và / hoặc đọc vào sổ ghi chép. Ví dụ: tôi có một tệp, .envcó định nghĩa biến môi trường của tôi ở định dạng VARIABLE_NAME=VARIABLE_VALUE(không có dòng trống hoặc dấu cách thừa). Bạn có thể nguồn tệp này trong .bashrchoặc .bash_profiletệp khi bắt đầu một phiên đầu cuối mới và bạn có thể đọc tệp này vào sổ ghi chép với nội dung như,

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

Tôi đã sử dụng một đường dẫn tương đối để cho thấy rằng .envtệp này có thể sống ở bất kỳ đâu và được tham chiếu liên quan đến thư mục chứa tệp sổ ghi chép. Điều này cũng có lợi thế là không hiển thị các giá trị biến trong mã của bạn ở bất kỳ đâu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.