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

vhipe2zx  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(102)

这是我的第一篇文章,所以请告诉我,如果我做错了什么。
我对在ipython中使用不同的编程语言很感兴趣,类似于emacs org模式中的babel/literal编程。我喜欢emacs org模式的一点是,一个人可以有多个“单元”连接到同一个R/bash会话。这允许我重用在文档的前面部分创建的变量/函数,即使我在中间做了其他事情。
我发现在ipython中使用Rmagic是可能的。举个例子

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中做类似的事情。但是,无论我使用“%%script bash”还是%%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,但它似乎对我的情况没有帮助。

soat7uwm

soat7uwm1#

一个选项(尽管有限)允许设置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字符似乎进入了变量。你可以使用echo -n代替echo来防止换行符被添加到变量中。
有关使用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?

相关问题