如何在 Jupyter 笔记本中设置 env 变量

我有一个问题,木星不能看到在 bashrc 文件中的 env 变量,有没有办法加载这些变量在木星或添加自定义变量到它?

237670 次浏览

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

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

如果你正在使用 Systemd,我刚刚发现你似乎必须将它们添加到 Systemd 单元文件中。这是在 Ubuntu 16上的。把它们放进。个人资料及。Bashrc (甚至/etc/profile)导致在 juypter 笔记本中不能使用 ENV Vars。

我不得不编辑:

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

然后在单元文件中输入我想读取的变量,比如:

Environment=MYOWN_VAR=theVar

只有这样我才能从朱庇特笔记本里读出来。

要在一个 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

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

在我的例子中,张量流需要导出的变量来成功地导入到笔记本中。

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

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

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

还有

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

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

如果使用 Python,可以在 .env文件中定义环境变量,并使用 巨蟒 -dotenv从 Jupiter 笔记本中加载它们。

安装 python-dotenv:

pip install python-dotenv

加载 .env文件到木星笔记本中:

%load_ext dotenv
%dotenv

如果你的笔记本是由 Jupiter Hub 产生的,你可能需要配置(在 jupyterhub_config.py中)环境变量的列表,这些变量可以通过设置从 Jupiter Hub 进程环境传递到笔记本环境

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

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

参见: Spawner.environment

你可以用 docker 运行 jupyter 笔记本,不必管理依赖性泄漏。

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

然后问问朱庇特关于打开的笔记本, jupyter notebook list
令牌 = 012456788997977a6eb11e45fff
Url 可以复制粘贴,如果您已经更改了端口,请验证端口。

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

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