在Ipython中处于交互模式时,sys.argv是不同的

时间:2016-07-06 20:32:58

标签: ipython interactive argv

当我在交互模式下使用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 个答案:

答案 0 :(得分:0)

如果我只是调用ipython,请查看sys.argv

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

你的Out[2]看起来一样 - 由shell和Python解释器提供的完整列表。请记住,我们正在使用ipython import:

运行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后,它会恢复sys.argv

这不是一个错误,你没有做错任何事 - 除了期望两个sys.argv是相同的。看起来在普通的Python shell中,两个{{1}}是相同的(没有shell本身使用的任何选项)。