2016-07-06 8 views
1

で対話モードにするとき異なっている私は、対話型モードでIpythonでスクリプトを実行すると、sys.argv引数リストは、スクリプトよりも実行の対話的な部分で異なっています。sys.argvのはIpython

は、これはバグ、または私が何か間違ったことをやっていますか?

ありがとうございます!

[email protected]:~$ cat test.py 
import sys 
print(sys.argv) 
temp = sys.argv 

[email protected]:~$ 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

私はちょうどipythonを起動し、sys.argvを見れば、私は

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

あなたOut[2]取得するには、同じように見えます - 完全なリストをシェルと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と同じ コマンドを指定した場合と同様に、スクリプトに 残りの引数を渡して、ファイルして終了を実行します。引数がスクリプトに 渡される前に、あなたはそれらを解析しようとするからIPythonを防ぐために、--を指定する必要があります。

だから、明示的

ipython -i test.py -- foo bar 

が(実質的に)なると言っている - またはとして実行されます。ipythonコードは、多くの処理(サブクラス​​など)パーサを持って

python test.py foo bar 

異なる議論。しかし、それはハンドル、または--をたどることができないものは脇に置き、そしてあなたのtest.pyが見るsys.argvに入れています。

しかし、どうやらsys.argvは、対話型セッションに与えられているものではないこと。

私はあなたが

$ipython 
In[0]: %run test.py foo bar 
... 

%run同じ効果を得るだろうと思うが、現在のsys.argvを保存し、sys.argv = [filename] + argsで新しいものを構築します。その後、test.pyを実行すると、sys.argvが復元されます。

これはバグではありません、あなたは何も悪いことをしていない - と同じように2 sys.argvを期待除いて。単純なPythonシェルでは、2つのsys.argvが同じであることが分かります(シェル自体が使用するオプションはありません)。