将参数传递给单元格魔法命令%%script

7
最相关的问题是这个:在Ipython中,如何将参数传递给一个单元格,就像它是自己的脚本一样? 我正在编写一个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)

但是这样会出现错误:`Got unknown argument: path/to/files`,因为该参数被传递给了魔法命令而不是Python脚本。有没有办法解决这个问题? 编辑: 这与所链接的问题不同,因为我正在使用单元格魔法而不是行魔法。我更喜欢在笔记本中只显示所有代码。

可能是在jupyter笔记本中运行带参数的Python脚本的重复问题。 - Reblochon Masque
1
注意到您的编辑,我会撤回我的重复建议;确实这个重复是针对一行魔法的。这是一个好问题。 - Reblochon Masque
1个回答

1

我不太记得我在哪里找到这个,似乎也没有记录,但这是单元格魔法非常有用的特性。

这不是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

第二个单元格输出:

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}'将替换上述内容。

文档在这里,但它们并没有深入介绍%%script的作用。根据这种行为,看起来Jupyter将其余部分作为标准输入提供。这很有趣,因为它说“%%script基本上是shebang”,但事实并非如此(否则我们不需要bash的-s)。所以在您的情况下,您可以用script pvpython替换我上面使用的bash -s魔法命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接