有没有办法从%%bash
或其他%%script
单元格中访问当前python内核中的变量?
也许是命令行参数或环境变量?
答案 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变量(字符串表示)将在空格上分割,因此如果myPythonVar
是datetime.datetime
且str(myPythonVar)
为"2013-10-30 05:04:09.797507"
,则上面的bash脚本会收到3个位置变量,前两个变量值为2013-10-30
和05: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}