Ipython bash / shell cell magics:我可以在单元格之间有持久变量吗?

时间:2015-05-13 12:29:52

标签: python bash shell emacs ipython

这是我关于SO的第一篇文章,所以请告诉我我是否做错了。

我有兴趣在ipython中使用不同的编程语言,类似于emacs org模式中的babel / literal编程。我喜欢emacs org模式的是一个人可以拥有多个"单元"连接到相同的R / bash会话。这允许我重复使用在文档的早期部分中创建的变量/函数,即使我在其间做了其他事情。

我发现在使用Rmagic的ipython中可以实现这一点。作为一个例子

In [1]: %load_ext rpy2.ipython

In [2]: %%R
        a <- 3
        a
Out [2]: 3

In [3]: something_in_python = 'I am doing something unrelated now'

In [4]: %%R
        cat('My variable a is still here, its value is: ', a) # a is still here!

Out [4]: My variable is still here, its value is: 3

我非常希望能够在bash中做类似的事情。但是,无论我是否使用&#34; %%脚本bash&#34;或%% sx,变量不是持久的。这是我想要做的:

In [1]: %%script bash
        var1="hello"
        echo $var1

Out[1]: hello

In [2]: %%script bash
        echo $var1 # I need $var1 to be present in this cell too - but its gone!

Out[62]: 

无论如何在多个单元格中都有相同的基本会话?或者至少以某种方式传递变量。当然,我可以将变量传递给python,然后再回到下一个bash单元格,但我觉得必须有更好的方法。谢谢你的帮助!

PS:我找了一个解决方案,但我在这里或通过谷歌搜索都找不到任何东西。有一些这样的东西:IPython Notebook previous cell content,但它似乎对我的情况没有帮助。

1 个答案:

答案 0 :(得分:2)

一个选项虽然有限,但允许设置stdout和stderr变量。这使您可以在单元格之间设置和传递两个变量。例如:

In [1]:%%bash --out var1 --err var2
       echo "Hello"
       echo "Hi" >&2

In [2]:print(var1)
       print(var2)
# Resulting in:
       Hello

       Hi

In [3]:%%bash -s "$var1" "$var2"
       echo "arg1 takes on var1 = $1"
       echo "arg2 takes on var2 = $2"
# Resulting in:
       arg1 takes on var1 = Hello

       arg2 takes on var2 = Hi

请注意,eol字符似乎会进入变量。

有关使用stdout和stderr的详细信息,请参阅http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/IPython%20Kernel/Script%20Magics.ipynb

有关传回变量的详细信息,请参阅Can I access python variables within a `%%bash` or `%%script` ipython notebook cell?