使用 Jupyter 单元魔法时环境变量的范围

jst*_*rek 4 scope jupyter-notebook

我想了解变量范围如何在 Jupyter 笔记本中工作。

当我创建一个包含两个单元格的bash笔记本时,导出的环境变量跨单元格边界可见:

在 [1]:

export PATH=$PATH:~/samplepath
Run Code Online (Sandbox Code Playgroud)

在 [2]:

echo $PATH
Run Code Online (Sandbox Code Playgroud)

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

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

在 [1]:

%%script bash
export PATH=$PATH:~/samplepath
Run Code Online (Sandbox Code Playgroud)

在 [2]:

%%script bash
echo $PATH
Run Code Online (Sandbox Code Playgroud)

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

对于不同的魔法,这种行为保持相同(即,在 echo 前面使用感叹号而不是脚本魔法给出相同的结果)。

所以,我想了解在这种情况下的范围规则是什么,以及如何制作export真正的导出变量,以便它们在整个笔记本中可见。

kHa*_*hit 5

在 Jupyter 笔记本中(如您的第二个示例),笔记本中的 shell 命令在临时子 shell 中执行,即您使用!(或 under %%bash)编写的每个命令都在不同的子进程中运行。

这篇博文的一个很好的描述是:

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

在[1]:

%%bash 
export var="5"
echo $var
Run Code Online (Sandbox Code Playgroud)
5
Run Code Online (Sandbox Code Playgroud)

在[2]:

%%bash
echo $var
Run Code Online (Sandbox Code Playgroud)

无输出

这就是!cd /path/不能使用like 命令来导航文件系统的原因。查看关于此的另一篇博文

虽然bash notebook的情况不同,但所有内容都在单个 shell 中执行。

解决方案:

如果要将变量导出为环境shell变量,则可以使用%envmagic函数,如下所示:

在[3]:

%env var "5"
Run Code Online (Sandbox Code Playgroud)

在[4]:

%env var
Run Code Online (Sandbox Code Playgroud)

在[5]:

%%bash
echo $var
Run Code Online (Sandbox Code Playgroud)

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

'"5"'
Run Code Online (Sandbox Code Playgroud)

注意:但要注意,不要这样做,%env PATH=$PATH:~/samplepath因为它会简单地替换 PATH 变量,从而导致问题。上述解决方案仅推荐用于非系统变量。不过,您可以编辑.bashrc以普遍更改PATH变量。