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

Posted

技术标签:

【中文标题】如何在 Jupyter notebook 中设置环境变量【英文标题】:How to set env variable in Jupyter notebook 【发布时间】:2016-10-19 20:13:08 【问题描述】:

我的问题是 Jupyter 在 bashrc 文件中看不到 env 变量,有没有办法在 jupyter 中加载这些变量或向其中添加自定义变量?

【问题讨论】:

【参考方案1】:

要在 jupyter notebook 中设置环境变量,只需使用 % 魔术命令,%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 进程中)dict,并且不会真正设置 OS env var(例如,用于后续的 !shell 命令)。跨度> 我删除了我之前的 cmets,因为它们不太准确 - 但请注意 %env 和 %set_env 魔术命令在后端使用 os.environ[var] = val:github.com/ipython/ipython/blob/master/IPython/core/magics/… @michael 有没有办法在所有笔记本上保持环境?以这种方式设置环境似乎只会保留当前笔记本的环境。 @michael,如何取消设置环境变量?【参考方案2】:

您还可以在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

【讨论】:

您能否告诉我如何使用您建议的技术将C:\Program Files (x86)\Graphviz2.38\bin\dot.exe 添加到现有系统路径?如果我不使用管理员帐户,它会起作用吗?我正在使用 Windows 10。 正是我需要的。 Homebrew 的 Python 会覆盖 sys.executable,除非事先设置了 PYTHONEXECUTABLE,您必须在 python 运行之前设置它。 在我看来这是唯一正确的答案,因为它只使用 Jupyter 本身,而不是依赖于任何特定内核中可用的功能。 我如何在 jupyter 中获取这些变量名?【参考方案3】:

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

安装python-dotenv:

pip install python-dotenv

在 Jupyter 笔记本中加载 .env 文件:

%load_ext dotenv
%dotenv

【讨论】:

【参考方案4】:

您可以在代码中设置环境变量,如下所示:

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,更多信息可以找到here

【讨论】:

感谢 Kardaj,在 ~/.profile 中导出变量解决了它,似乎它不是从 bashrc 读取的,这有点奇怪。 michael's answer with %env MY_VAR=MY_VALUE 应该是这个问题的正确答案 @SidaZhou 为什么迈克尔的回答更好? @SidaZhou 取决于用例-如果您希望凭据在环境中可用-并且不希望凭据在您的笔记本中(例如在源代码控制中),那么这并不理想。 【参考方案5】:

我遇到的一个问题:以下两个命令是等效的。注意第一个不能使用引号。有点违反直觉,在使用 %env VAR ... 时引用字符串将导致引号被包含为变量值的一部分,这可能不是您想要的。

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

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

【讨论】:

【参考方案6】:

如果您在启动笔记本之前需要设置变量,唯一对我有用的解决方案是 env VARIABLE=$VARIABLE jupyter notebook.bashrc 中的 export VARIABLE=value

在我的例子中,tensorflow 需要导出的变量才能成功地将其导入笔记本。

【讨论】:

【参考方案7】:

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

我必须编辑:

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

并将我想读取的变量放入单元文件中,例如:

Environment=MYOWN_VAR=theVar

只有这样我才能从 juypter notebook 中阅读它。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

如果您的 notebook 是由 Jupyter Hub 生成的,您可能需要配置(在 jupyterhub_config.py 中)允许通过设置从 JupyterHub 进程环境转移到 Notebook 环境的环境变量列表

c.Spawner.env_keep = [VAR1, VAR2, ...]

(https://jupyterhub.readthedocs.io/en/stable/api/spawner.html#jupyterhub.spawner.Spawner.env_keep)

另见:Spawner.environment

【讨论】:

【参考方案10】:

您可以使用 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 listhttp:// 0.0.0.0:8888/?token=012456788997977a6eb11e45fffff Url可以复制粘贴,如果你改变了,请验证端口。

创建一个笔记本并粘贴以下内容, 进入笔记本

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

【讨论】:

以上是关于如何在 Jupyter notebook 中设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

python 在Jupyter Notebook中设置pandas数据帧的宽度

无法在 Jupyter notebook-anaconda 中设置 spark home

jupyter笔记本起始目录

如何修改jupyter notebook的默认工作路径

将大数据集读取到Jupyter Notebook和Manipulate

如何修改jupyter notebook的默认工作路径