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

Eha*_*awy 55 python bash environment-variables jupyter-notebook

我有一个问题,Jupyter在bashrc文件中看不到env变量,有没有办法在jupyter中加载这些变量或者为它添加custom变量?

mic*_*ael 66

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

  • @michael 有没有办法在所有笔记本上保持环境?以这种方式设置环境似乎只会保留当前笔记本的环境。 (3认同)
  • 我删除了我之前的评论,因为它们不太准确 - 但请注意 %env 和 %set_env 魔术命令在后端使用`os.environ[var] = val`:https://github.com/ipython/ipython /blob/master/IPython/core/magics/osm.py#L430 (2认同)

eva*_*n_b 20

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

%env MYPATH=C:/Folder Name/file.txt
Run Code Online (Sandbox Code Playgroud)

import os
os.environ['MYPATH'] = "C:/Folder Name/file.txt"
Run Code Online (Sandbox Code Playgroud)

  • 难道它不会影响 Windows 上 VS Code 上的 Jupyter? (2认同)

kar*_*daj 16

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

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')
Run Code Online (Sandbox Code Playgroud)

这当然是一个临时修复,为了得到一个永久的,你可能需要将变量导出到你的~.profile,更多的信息可以在这里找到

  • 迈克尔用'%env MY_VAR = MY_VALUE`的回答应该是这个问题的正确答案 (3认同)
  • 感谢 Kardaj,在 ~/.profile 中导出变量解决了它,似乎它不是从 bashrc 读取的,这有点奇怪。 (2认同)
  • @SidaZhou 取决于用例 - 如果您希望凭证在 env 中可用 - 并且不希望凭证出现在您的笔记本中(例如在源代码管理中),那么这并不理想。 (2认同)

Ber*_*ard 13

您还可以在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":""}
}
Run Code Online (Sandbox Code Playgroud)

这种方法的用例和优点

  • 在我的用例中,我想设置变量LD_LIBRARY_PATH,该变量影响如何加载已编译模块(例如,用C编写)。使用设置此变量%set_env无效。
  • 我可以在不同的环境中使用多个python内核。
  • 要更改环境,我只需要切换/重新启动内核,而不必重新启动jupyter实例(如果我不想在另一个笔记本中松开变量,则很有用)。参见-但是-https: //github.com/jupyter/notebook/issues/2647

  • 这对我有用,但请记住为环境变量添加所需的正确值。它的编写方式(至少对于我在 Jupyter Lab 来说)只是将变量全部删除。例如,为了能够在 Jupyter Notebook 上运行 Tensorflow,我使用了: `"env": {"LD_LIBRARY_PATH":"/opt/miniconda3/envs/tensorflow/lib:${LD_LIBRARY_PATH}"}`。 (2认同)

apa*_*lue 9

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

安装python-dotenv:

pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)

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

%load_ext dotenv
%dotenv
Run Code Online (Sandbox Code Playgroud)


Bas*_*hdl 6

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

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


小智 6

一个相关的(短期)解决方案是将环境变量存储在一个具有可预测格式的文件中,可以在启动终端和/或读入笔记本时获取该文件。例如,我有一个文件 ,.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
Run Code Online (Sandbox Code Playgroud)

我使用相对路径来表明该.env文件可以存在于任何地方,并且可以相对于包含笔记本文件的目录进行引用。这还有一个优点:不在代码中的任何地方显示变量值。