如何在Jupyter Notebook中设置环境变量


Answers:


115

要在jupyter笔记本中设置env变量,只需使用%魔术命令%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命令)。
迈克尔

2
我删除了我刚才提出的意见,因为他们并不准确-但要注意的是,%env和%set_env魔法命令使用os.environ[var] = val的后端:github.com/ipython/ipython/blob/master/IPython/core/magics/...
evan_b

2
@michael有没有办法在所有笔记本电脑上保持环境?以这种方式设置环境似乎只能保留当前笔记本的环境。
詹姆斯·维尔茨巴

30

您还可以在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可能看起来像这样(除了display_name和,我没有对已安装的kernel.json进行任何修改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无效。
  • 我可以在不同的环境中使用多个python内核。
  • 要更改环境,我只需要切换/重新启动内核,而不必重新启动jupyter实例(很有用,如果我不想在另一个笔记本中松开变量)。参见-但是-https: //github.com/jupyter/notebook/issues/2647

您能告诉我如何C:\Program Files (x86)\Graphviz2.38\bin\dot.exe使用建议的技术添加到现有系统路径吗?如果我不使用管理员帐户,是否可以使用?我使用的是Windows 10
Khurram马吉德

正是我所需要的。sys.executable除非PYTHONEXECUTABLE事先设置,否则Homebrew的Python会覆盖,除非您必须在python运行之前进行设置。
Stefan Dragnev

在我看来,这是唯一正确的答案,因为它仅使用Jupyter本身,而不是依赖于任何特定内核中可用的功能。
shadowtalker

19

如果您使用的是Python,则可以在.env文件中定义环境变量,然后使用python-dotenv从Jupyter笔记本中加载它们。

安装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应该是这个问题的正确答案
Sida Zhou

@SidaZhou迈克尔的答案为什么更好?

2
@SidaZhou取决于用例-如果您希望凭据在环境中可用-并且不希望凭据出现在笔记本中(例如,在源代码管理中),那么这不是理想的选择。
morganics

4

如果你需要的变量设置你开始在笔记本前,只有为我工作的解决方案是env VARIABLE=$VARIABLE jupyter notebookexport VARIABLE=value.bashrc

在我的情况下,tensorflow需要导出的变量才能成功将其导入到笔记本中。


2

我遇到了一个陷阱:以下两个命令是等效的。请注意,第一个不能使用引号。有点违反直觉的是,使用时对字符串进行引用%env VAR ...将导致引号包含在变量值中,这可能不是您想要的。

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

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

1

如果您使用的是systemd,我刚刚发现您似乎必须将它们添加到systemd单元文件中。这在Ubuntu 16上。将它们放入.profile和.bashrc(甚至/ etc / profile)中,导致juypter笔记本中不提供ENV Vars。

我必须编辑:

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

并输入要在单位文件中读取的变量,例如:

Environment=MYOWN_VAR=theVar

只有到那时,我才能从juypter笔记本中阅读它。


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文件可以存在于任何位置,并且可以相对于包含笔记本文件的目录进行引用。这也具有不在代码中的任何位置显示变量值的优点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.