使用Jupyter细胞魔术时环境变量的作用域

时间:2019-02-18 11:12:33

标签: scope jupyter-notebook

我想了解Jupyter笔记本中变量作用域的工作原理。

当我创建具有两个单元格的 bash 笔记本时,导出的环境变量在单元格边界之间是可见的:

在[1]中:

export PATH=$PATH:~/samplepath

在[2]中:

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myuser/samplepath

但是,如果我创建一个 Python 笔记本并使用单元魔术来达到相同的结果,则跨单元边界似乎不再可见变量:

在[1]中:

%%script bash
export PATH=$PATH:~/samplepath

在[2]中:

%%script bash
echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

对于不同的魔术,此行为保持不变(即,在回声之前使用感叹号而不是脚本魔术会产生相同的结果)。

因此,我想了解这种情况下的范围规则,以及如何使export真正地导出变量,以便它们在整个笔记本中可见。

1 个答案:

答案 0 :(得分:2)

在Jupyter笔记本(如您的第二个示例)中,笔记本中的shell命令在一个临时子shell中执行,即您使用!(或在{{1下)编写的每个命令}})在另一个子进程中运行。

this blog post中的一个很好的描述是:

  

Jupyter Notebook外壳程序命令在外壳程序中执行,该外壳程序是运行笔记本程序的外壳程序的子进程。因此,子(单元)外壳中环境变量的变化不会反映在父(笔记本)外壳中。

在[1]中:

%%bash
%%bash 
export var="5"
echo $var

在[2]中:

5

无输出

这就是为什么无法使用%%bash echo $var 之类的命令来导航文件系统的原因。选中another blog post

bash笔记本的情况不同,一切都在单个shell中执行。

解决方案:

如果要将变量导出到环境外壳变量,则可以使用%env魔术函数,如下所示:

在[3]中:

!cd /path/

在[4]中:

%env var "5"

在[5]中:

%env var

In [4]和In [5]的输出:

%%bash
echo $var

注意:但是要注意,不要执行'"5"' ,因为它只会替换PATH变量,从而引起问题。仅建议将以上解决方案用于非系统变量。不过,您可以编辑%env PATH=$PATH:~/samplepath以普遍更改.bashrc变量。