如何为IPython的魔术命令添加自定义标志? (.ipy文件)

时间:2016-07-05 18:34:08

标签: python ipython ipython-magic

是否可以为IPython的魔术命令添加自定义标志?更具体地说,我想使用带有自制标志的%run命令:

%run script.ipy --flag "option"

并且能够在脚本中使用“选项”。

对于.py文件,答案在此处提供:Command Line Arguments In Python

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,这个问题不只是在Python脚本中处理命令行参数。这是关于通过.ipy运行的%run文件中处理它们。

如果我将test.ipy创建为

import sys
print(sys.argv)

从shell运行它,我看到命令行参数:

1223:~/mypy$ python3 test.ipy -test foo
['test.ipy', '-test', 'foo']

但是从ipython会话开始,我不

In [464]: %run test.ipy --flag test
['/usr/bin/ipython3']

如果我使用py名称

制作副本
In [468]: %run testipy.py --flag test
['testipy.py', '--flag', 'test']

所以%run ...ipy表现不同。这是一个ipython问题,而不是一般的Python命令行。

=====

%run doc有这一点:

  

有一种特殊用法,上述文字不适用于:   如果文件名以.ipy [nb]结尾,则该文件作为ipython脚本运行,   就好像命令是在IPython提示符下写的一样。

在这种情况下,test.ipy脚本看到的内容与我输入时的sys.argv相同:

In [475]: sys.argv
Out[475]: ['/usr/bin/ipython3']

因此,如果我在当前会话中修改sys.argv,例如添加几个字符串:

In [476]: sys.argv += ['--flag','test']

In [477]: sys.argv
Out[477]: ['/usr/bin/ipython3', '--flag', 'test']

In [479]: %run test.ipy
['/usr/bin/ipython3', '--flag', 'test']

我的ipy脚本现在可以看到它们了。

这就是答案 - 在使用sys.argv之前将命令行参数放在%run ...ipy中。

(在使用sys.argv进行高级操作时,我已经使用argparse进行了这种摆弄。)

更多ipython魔法

In [480]: %run??

向我展示了它的doc和它的代码。因此,我可以看到它如何处理特殊的.ipy文件。由于它很容易找到,我不会在这里复制它。

还有另一种解决方案 - 不要尝试使用ipy文件的命令行编码方式。

如果我添加

print(x)

到该测试文件的行,并在我的Ipython会话中定义了x,我看到了那个打印。但是我在.py中添加了相同的图片,我会得到Nameerror。当他们说ipy运行就好像输入一样,就意味着它。实际上,运行ipy是剪贴板中%paste的替代方法。