当我在交互模式下使用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']
答案 0 :(得分:0)
如果我只是调用ipython
,请查看sys.argv
我
In [3]: sys.argv
Out[3]: ['/usr/bin/ipython3']
你的Out[2]
看起来一样 - 由shell和Python解释器提供的完整列表。请记住,我们正在使用ipython
import:
#!/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
后,它会恢复sys.argv
。
这不是一个错误,你没有做错任何事 - 除了期望两个sys.argv
是相同的。看起来在普通的Python shell中,两个{{1}}是相同的(没有shell本身使用的任何选项)。