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

207

我有一个问题,就是Jupyter无法在bashrc文件中看到环境变量。有没有一种方法可以在jupyter中加载这些变量或者添加自定义变量?

11个回答

269

你是否尝试过使用引号?请注意,更改os.environ并不相同——它只能更改该字典(在内存中,当前python进程),并且不能真正设置操作系统环境变量(例如用于后续的!shell命令)。 - michael
3
我删除了之前的评论,因为它们不太准确 - 但请注意,%env和%set_env魔法命令在后端使用os.environ[var] = val:https://github.com/ipython/ipython/blob/master/IPython/core/magics/osm.py#L430 - evan_b
6
@michael 有没有办法在所有笔记本之间保持环境?以这种方式设置环境似乎只会将环境保持在当前笔记本中。 - James Wierzba
1
@michael,怎样取消一个环境变量? - Priyansh Agrawal

92

您还可以在kernel.json文件中设置变量:

如果您每次启动jupyter内核都需要相同的环境变量,尤其是如果您有多个不同任务的环境变量集,则我的解决方案非常有用。

要使用您的环境变量创建一个新的IPython内核,请执行以下操作:

  • 阅读https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs文档
  • 运行jupyter kernelspec list以查看已安装内核的列表以及文件所存储的位置。
  • 将包含kernel.json的目录(例如命名为python2)复制到新目录(例如python2_myENV)中。
  • 更改新kernel.json文件中的display_name
  • 添加定义环境变量的env字典。

您的内核json可能如下所示(我没有修改已安装的kernel.json以外的任何内容,只有display_nameenv):

{
 "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

1
请问您能否建议我如何使用您提供的技巧将C:\Program Files (x86)\Graphviz2.38\bin\dot.exe添加到现有系统路径中?如果我没有使用管理员帐户,这是否有效?我正在使用Windows 10。 - Khurram Majeed
正是我所需要的。Homebrew 的 Python 会覆盖 sys.executable,除非事先设置了 PYTHONEXECUTABLE,而这必须在 Python 运行之前设置。 - Stefan Dragnev
我该如何在Jupyter中访问那些变量名? - Jonas Palačionis
2
这个对我来说起作用,但要记得添加你想要的环境变量的正确值。按照它目前的写法(至少在我的Jupyter Lab中),会完全清除该变量。例如,为了在Jupyter笔记本上运行Tensorflow,我使用了: "env": {"LD_LIBRARY_PATH":"/opt/miniconda3/envs/tensorflow/lib:${LD_LIBRARY_PATH}"} - Gustavo Seabra
1
我在使用更新的 kernel.json 文件时遇到了一些问题,最终解决方法是在工作区根目录下创建一个 .env 文件,并在其中设置 LD_LIBRARY_PATH=... - Igor Kołakowski
显示剩余2条评论

73
如果您正在使用Python,可以在.env文件中定义您的环境变量,并使用python-dotenv从Jupyter笔记本中加载它们。
安装python-dotenv:
pip install python-dotenv

在 Jupyter Notebook 中加载 .env 文件:

%load_ext dotenv
%dotenv

24
你可以按照以下方式在代码中设置环境变量:

您可以按照以下方式在代码中设置环境变量:

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
5
迈克尔使用 %env MY_VAR=MY_VALUE 的回答应该是这个问题的正确答案。 - Sida Zhou
@SidaZhou 为什么迈克尔的回答更好? - Him
3
取决于具体情况 - 如果你希望凭证在环境中可用,并且不希望凭证出现在你的笔记本中(例如在源代码控制中),那么这并不理想。 - morganics

19

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

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

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

1
这可能不会影响在Windows上的VS Code中的Jupyter吗? - Royi

8
如果您需要在启动笔记本之前设置变量,唯一对我有效的解决方案是使用env VARIABLE=$VARIABLE jupyter notebook命令,并在.bashrc文件中使用export VARIABLE=value命令。在我的情况下,TensorFlow需要这个导出的变量才能在笔记本中成功导入它。

5

一个相关的(短期)解决方案是将您的环境变量存储在一个单独的文件中,具有可预测的格式,在启动终端和/或读入笔记本时可以被调用。例如,我有一个名为.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 文件可以存储在任何地方,并且可以相对于包含笔记本文件的目录引用。这样做的好处是不会在代码中显示变量的值。

2

2
如果您正在使用systemd,我刚刚发现您似乎需要将它们添加到systemd单元文件中。这是在Ubuntu 16上的情况。将它们放入.profile和.bashrc(甚至是/etc/profile)中会导致ENV变量在jupyter笔记本中不可用。
我不得不编辑:
/lib/systemd/system/jupyer-notebook.service

然后将我想要在单元文件中读取的变量放入其中,如:

Environment=MYOWN_VAR=theVar

只有这样,我才能从juypter笔记本中阅读它。

1

您可以使用Docker运行Jupyter Notebook,而无需管理依赖关系泄漏。

docker run -p 8888:8888 -v /home/mee/myfolder:/home/jovyan --name notebook1 jupyter/notebook
docker exec -it notebook1 /bin/bash

请询问Jupyter打开的笔记本情况,

jupyter notebook list
http:// 0.0.0.0:8888/?token=012456788997977a6eb11e45fffff

可以复制并粘贴URL,如果您已更改端口,请验证端口。

创建一个笔记本,并将以下内容粘贴到笔记本中:

!pip install python-dotenv
import dotenv
%load_ext dotenv
%dotenv

第二部分完美地为我工作了,谢谢! - Kubra Altun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接