2016-07-06 7 views
1

Wenn ich ein Skript mit Ipython im interaktiven Modus ausführen, ist die sys.argv Argumentliste im interaktiven Teil der Ausführung anders als im Skript.sys.argv unterscheidet sich im interaktiven Modus in Ipython

Ist das ein Fehler, oder mache ich etwas falsch?

Danke!

[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'] 

Antwort

0

Wenn ich ipython nur aufrufen, und schauen Sie sich sys.argv ich

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

Ihre Out[2] gleich aussieht - die vollständige Liste, wie von der Shell und Python-Interpreter zur Verfügung gestellt. Denken Sie daran, wir eine Python-Session mit ipython Import ausgeführt werden:

#!/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) 

Aber Blick auf ipython -h; im ersten Absatz:

führt er die Datei und Ausfahrten, die verbleibenden Argumente an das Skript vorbei, wie wenn Sie den gleichen Befehl mit Python angegeben hatten. Sie müssen möglicherweise -- vor Argumenten angeben, um an das Skript übergeben zu werden, um zu verhindern, dass IPython versucht, sie zu analysieren.

es also ausdrücklich sagen, dass

ipython -i test.py -- foo bar 

(in-Effekt) wird - oder ausgeführt wird, wie:

python test.py foo bar 

Das hat ipython Code einen Parser (als Unterklasse argparse), die viele Griffe verschiedene Argumente. Aber diejenigen, die nicht behandelt werden können, oder folgen -- sind beiseite gelegt, und setzen Sie die sys.argv, die Ihre test.py sieht.

Aber anscheinend ist das sys.argv nicht, was der interaktiven Sitzung gegeben wird.

ich glaube, Sie den gleichen Effekt würde

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

%run den aktuellen sys.argv speichert, und baut eine neue mit sys.argv = [filename] + args. Dann nach der Ausführung Ihrer test.py stellt es die sys.argv wieder her.

Dies ist kein Fehler, und Sie tun nichts falsch - außer zu erwarten, dass die zwei sys.argv identisch sein. Es scheint, dass in einer einfachen Python-Shell die beiden sys.argv die gleichen sind (ohne die Optionen, die die Shell selbst verwendet).

Verwandte Themen