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

时间:2016-06-17 21:53:16

标签: python bash environment-variables jupyter-notebook

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

8 个答案:

答案 0 :(得分:42)

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

答案 1 :(得分:14)

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

~.profile

这当然是临时修复,为了获得永久性修复,您可能需要将变量导出到String turnOrder; do { Scanner to = new Scanner(System.in); turnOrder = to.nextLine(); if ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder))) { System.out.println("Type your answer as 'first' or 'second.' Without the punctuation."); } else {} } while ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder))); ,可以找到更多信息here

答案 2 :(得分:5)

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

安装python-dotenv:

pip install python-dotenv

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

%load_ext dotenv
%dotenv

答案 3 :(得分:4)

您也可以在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_nameenv之外,我没有对已安装的kernel.json进行任何修改):

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

答案 4 :(得分:1)

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

我必须编辑:

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

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

Environment=MYOWN_VAR=theVar

然后才能从juypter笔记本中读取它。

答案 5 :(得分:1)

如果您在启动笔记本之前需要设置变量,那么唯一适用于我的解决方案是ClassNotFoundException : deploy.FinalJob env VARIABLE=$VARIABLE jupyter notebook export VARIABLE=value

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

答案 6 :(得分: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文件可以存在于任何地方并且相对于包含该笔记本文件的目录被引用。这样做的好处是不会在代码中的任何位置显示变量值。

答案 7 :(得分:0)

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

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

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