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真正的导出变量,以便它们在整个笔记本中可见。
在 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变量。
| 归档时间: |
|
| 查看次数: |
2525 次 |
| 最近记录: |