我可以在`%% bash`或`%% script` ipython笔记本单元格中访问python变量吗?

时间:2013-10-25 01:21:31

标签: ipython-notebook ipython-magic

有没有办法从%%bash或其他%%script单元格中访问当前python内核中的变量?

也许是命令行参数或环境变量?

7 个答案:

答案 0 :(得分:56)

Python变量可以在%%bash%%script单元格的第一行中访问,因此可以作为命令行参数传递给脚本。例如,使用bash,您可以执行以下操作:

%%bash -s "$myPythonVar" "$myOtherVar"
echo "This bash script knows about $1 and $2"

-s命令行选项允许您将位置参数传递给bash,通过$n访问第n个位置参数。请注意,实际分配给bash位置变量的是str(myPythonVariable)的结果。如果您传递包含引号字符(或其他bash敏感字符)的字符串,则需要使用反斜杠转义它们(例如:\")。

引号很重要 - 如果没有它们,python变量(字符串表示)将在空格上分割,因此如果myPythonVardatetime.datetimestr(myPythonVar)"2013-10-30 05:04:09.797507",则上面的bash脚本会收到3个位置变量,前两个变量值为2013-10-3005:04:09.797507。它的输出将是:

This bash script knows about 2013-10-30 and 05:04:09.797507

如果你想命名变量而你正在运行linux,这是一种方法:

%%script env my_bash_variable="$myPythonVariable" bash
echo myPythonVariable\'s value is $my_bash_variable

您可以指定多个变量分配。再次提防引号和其他类似的事情(这里bash会痛苦地抱怨!)。要了解其工作原理,请参阅env手册页。

答案 1 :(得分:27)

要在使用语法!<some command>运行的bash命令中包含python变量,您可以使用{<variable>},如下所示:

In [1]: for i in range(3):
   ...:     !echo {i+1}
   ...:     
1
2
3

虽然这与OP提出的略有不同,但它与执行脚本任务密切相关且有用。 This post有更多关于在IPython和Jupyter笔记本中使用shell命令的技巧和示例。

答案 2 :(得分:3)

一个问题是,如果要提供给bash的变量是列表,则它不能按预期方式工作。

例如,在一个python单元格中:

l = ['A', 'B', 'C']

然后,如果将其直接提供给魔术选项的下一个单元格:

%%bash -s "$l"
for i in $1
do
echo $i
done

它会像这样奇怪地分裂:

['A',
'B',
'C']

最简单的答案是将代码放在大括号{}中,以将python列表转换为bash列表,如下所示:

%%bash -s "{" ".join(l)}"
for i in $1
do
echo $i
done

给出预期的输出:

A
B
C

答案 3 :(得分:2)

注意一个变体,如果你需要将一个简单变量以外的东西传递给bash脚本:

%%bash -s $dict['key1'] $dict['key2'] $dict['key3']

可怕的错误,但

%%bash -s {dict['key1']} {dict['key2']} {dict['key3']}

效果很好。

答案 4 :(得分:1)

如果像我这样的人最终在这里寻找在使用 ! 运行命令时如何使用 Python 变量,只需在变量前添加 $ 前缀即可:

!echo $foobar

答案 5 :(得分:0)

不,%%script魔法是自动生成的,不会进行任何神奇的进程间数据通信。 (对于%%R来说不是这种情况,但是在R个人的额外照顾下,这是一个独立的魔法

但是编写自己的魔法并不难做到。

答案 6 :(得分:0)

如果你愿意定义一个新的魔法,你可以使用 Python 字符串模板:

from IPython import get_ipython
from IPython.core.magic import register_cell_magic

ipython = get_ipython()


@register_cell_magic
def pybash(line, cell):
    ipython.run_cell_magic('bash', '', cell.format(**globals()))

然后如果你在 Python 中定义一个变量,例如:

test = 'Python variables'

你可以使用它:

%%pybash
echo '{test} will be expanded'
echo '{{double braces will be replaced with single braces}}'

结果:

Python variables will be expanded
{double braces will be replaced with single braces}