我想了解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
真正地导出变量,以便它们在整个笔记本中可见。
答案 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
变量。