将参数传递给单元魔术%% script

时间:2018-08-07 17:13:37

标签: python ipython paraview

与此最相关的问题是:In Ipython, how can I pass arguments to a cell as though it were its own script?

我正在编写一个ipython笔记本进行模拟,然后在paraview中创建动画。我这样做的方法是使用魔术命令运行一个单元格

%%script pvpython

因为paraview有自己的解释器。问题是我需要它将vtu文件的目录作为参数传递给它(这是IPython内核中的变量)。到目前为止,我还无法弄清楚这一点。我尝试过:

%%script pvpython path/to/files
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo')
args = parser.parse_args()
print(args.foo)

但是这会导致错误:`得到了未知的参数:path / to / files,因为该参数被传递给了magic命令而不是python脚本。有办法解决这个问题吗?

编辑:这与链接的问题不同,因为我使用的是单元魔术而不是线魔术。我希望我的所有代码都可以在笔记本中单独看到。

1 个答案:

答案 0 :(得分:0)

我不完全记得在哪里找到它的,而且似乎也没有记载,但这对于细胞魔术来说是非常有用的功能。

这不是python格式化机制,它是与!开头的行魔术插值中使用的jupyter插值相同。请注意,粗体引用变量中没有引号。

单元格1:

simple_var = 123
crazy_var = " with spaces \n 'asdf' $DOLLAR$$ $$SIGNS$$ "
import shlex
tamed_var = shlex.quote(crazy_var)

单元2:

%%bash -s '{simple_var}' {tamed_var} '{crazy_var}'

echo $#

for i in $(seq 1 $#) ; do
    echo "$i: ${!i}"
done

单元2的输出:

3
1: 123
2:  with spaces 
 'asdf' $DOLLAR$$ $$SIGNS$$ 
3:  with spaces 
 asdf $DOLLAR$$ $$SIGNS$$ 

顺便说一句,脚本形式也是计时bash单元的便捷方式:%%script time bash -s '{simple_var}' {tamed_var} '{crazy_var}'将是上面的替代方法。

文档是here,但它们没有深入研究%%script的作用。但是,基于此行为,看起来jupyter会将单元格的其余部分作为标准输入。这很有趣,因为它说“ %% script基本上是shebang”,而不是这种情况(否则我们不需要bash的-s)。因此,在您的情况下,您可以将我上面使用的bash -s替换为script pvpython