【问题标题】:Ipython bash/shell cell magics: can I have persistent variables between cells?Ipython bash/shell 单元格魔法:单元格之间可以有持久变量吗?
【发布时间】:2015-05-13 12:29:52
【问题描述】:

这是我在 SO 上的第一篇文章,如果我做错了什么,请告诉我。

我对在 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,但它似乎对我的情况没有帮助。

【问题讨论】:

  • 不,%%script%%sx 魔法在新的子进程中运行每个块,因此它们不能共享状态。有一个bash kernel 可以存储单元格之间的状态。如果你想用魔法做到这一点,你可以使用其中的一些机制并定义你自己的魔法,将代码发送到一个持久的 bash 进程。
  • 您好 Thomas,非常感谢您的帮助!如果我能让它为我工作,我会尽快调查并发布我所做的事情。现在知道它不适用于我迄今为止忽略的一些简单解决方案已经非常有帮助。再次感谢!

标签: python bash shell emacs ipython


【解决方案1】:

一个选项虽然有限,但允许设置 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?

【讨论】:

  • 抱歉这么久没反应,刚放假回来。当然,这并不是我想要的,但它是一个起点,似乎没有人有更好的解决方案,所以我会接受这个作为答案。谢谢!
猜你喜欢
  • 2013-11-03
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2015-06-22
  • 2013-09-23
  • 2011-03-29
  • 1970-01-01
  • 2015-06-06
相关资源
最近更新 更多