当在IPython的交互模式中时,sys.argv与普通模式不同。

3
当我在交互模式下使用Ipython运行脚本时,sys.argv参数列表在执行交互部分时与脚本中不同。
这是一个错误吗,还是我做错了什么?
谢谢!
oskar@RR06:~$ cat test.py
import sys
print(sys.argv)
temp = sys.argv

oskar@RR06:~$ ipython -i test.py -- foo bar
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
Type "copyright", "credits" or "license" for more information.

IPython 4.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
['/home/oskar/test.py', 'foo', 'bar']

In [1]: temp
Out[1]: ['/home/oskar/test.py', 'foo', 'bar']

In [2]: sys.argv
Out[2]: ['/usr/local/bin/ipython', '-i', 'test.py', '--', 'foo', 'bar']
1个回答

1
如果我只是调用ipython,并查看sys.argv,我会得到
In [3]: sys.argv
Out[3]: ['/usr/bin/ipython3']

你的 Out[2] 看起来和之前一样 - 它是由 shell 和 Python 解释器提供的完整列表。请记住,我们正在使用带有 ipython 导入的 Python 会话。
#!/usr/bin/env python3
# This script was automatically generated by setup.py
if __name__ == '__main__':
    from IPython import start_ipython
    start_ipython()
/usr/bin/ipython3 (END)

但是看一下ipython -h;在第一段中:

它执行文件并退出,将剩余的参数传递给脚本,就像您使用python指定相同的命令一样。您可能需要在要传递到脚本的args之前指定--,以防止IPython尝试解析它们。

所以它明确地表示

ipython -i test.py -- foo bar

"变成(实际上)- 或作为运行:"
python test.py foo bar
ipython代码有一个解析器(作为子类 argparse),可以处理许多不同的参数。但是无法处理或遵循 -- 的参数会被设置到 sys.argv 中,供你的 test.py 使用。
但显然,交互会话中没有使用给出的 sys.argv
我认为你会得到相同的效果。
$ipython
In[0]: %run test.py foo bar
...

%run 命令会保存当前的 sys.argv,并构建一个新的 sys.argv = [filename] + args。然后在运行你的 test.py 后,它会恢复原来的 sys.argv

这不是一个 bug,你没有做错任何事情,只是期望两个 sys.argv 是相同的。在普通的 Python shell 中,两个 sys.argv 看起来是相同的(没有使用 shell 自身选项)。


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