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

Tak*_*oda 6 python ipython paraview

与这个问题最相关的问题是:在Ipython中,如何将参数传递给单元格,就像它是自己的脚本一样?

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

%%script pvpython
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

VF1*_*VF1 1

我不太记得在哪里找到这个,而且似乎没有记录,但这对于细胞魔法来说是一个非常有用的功能。

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

单元格 1:

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

单元 2:

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

echo $#

for i in $(seq 1 $#) ; do
    echo "$i: ${!i}"
done
Run Code Online (Sandbox Code Playgroud)

单元 2 输出:

3
1: 123
2:  with spaces 
 'asdf' $DOLLAR$$ $$SIGNS$$ 
3:  with spaces 
 asdf $DOLLAR$$ $$SIGNS$$ 
Run Code Online (Sandbox Code Playgroud)

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

文档在这里,但他们没有深入探讨具体内容%%script。不过,根据这种行为,jupyter 似乎将单元格的其余部分作为标准输入。这很有趣,因为它说“%%script is basic shebang”,但事实并非如此(否则我们就不需要 bash 了-s)。因此,在您的情况下,您可以将bash -s我上面使用的魔法替换为script pvpython.