2016-07-06 5 views
1

Lorsque j'exécute un script avec Ipython en mode interactif, la liste d'arguments sys.argv est différente dans la partie interactive de l'exécution que dans le script.sys.argv est différent en mode interactif dans Ipython

Est-ce un bug, ou est-ce que je fais quelque chose de mal?

Merci!

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

Répondre

0

Si j'invoque simplement ipython, et regarde sys.argv je reçois

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

Votre Out[2] regarde la même chose - la liste complète fournie par le shell et interpréteur Python. Rappelez-vous que nous courons une session Python avec 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) 

Mais regardez ipython -h; dans le premier paragraphe:

il exécute le fichier et sort, en passant les arguments restants au script, comme si vous aviez spécifié la même commande avec python. Vous devrez peut-être spécifier -- avant que les arguments soient passés au script pour empêcher IPython d'essayer de les analyser.

Il est donc explicitement dire que

ipython -i test.py -- foo bar 

devient (en vigueur) - ou est exécuté comme:

python test.py foo bar 

Le code ipython a un analyseur (comme sous-classe argparse) qui gère de nombreux différents arguments. Mais ceux qu'il ne peut pas gérer, ou suivre -- sont mis de côté, et mis dans le sys.argv que voit votre test.py.

Mais apparemment, sys.argv n'est pas ce qui est donné à la session interactive.

Je pense que vous obtiendrez le même effet

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

%run enregistre le sys.argv courant, et construit un nouveau avec sys.argv = [filename] + args. Après avoir exécuté votre test.py, il restaure le sys.argv.

Ce n'est pas un bogue, et vous ne faites rien de mal - sauf attendre que les deux sys.argv soient les mêmes. Il semble que dans un shell Python ordinaire, les deux sys.argv sont les mêmes (sans aucune des options que le shell lui-même utilise).