2015-04-19 1 views
1

J'ai écrit une fonction qui accepte jusqu'à 4 options et 2 arguments. Les options sont -1, -2, -3 et -u. Par défaut, leurs valeurs sont définies sur true, true, true et false, respectivement, mais l'activation de l'une des options provoque le basculement de cette valeur. Le problème est, même quand je spécifie, disons,Python optparse n'accepte pas les options

python comm.py -1 -2 -u test test2 

et d'imprimer les valeurs de l'option, ils montrent toujours les valeurs par défaut. Voici la partie pertinente de mon code:

... 
... 
... 
parser.add_option("-1", action="store_false", dest="xcol1", default=True, help="...") 
parser.add_option("-2", action="store_false", dest="xcol2", default=True, help="...") 
parser.add_option("-3", action="store_false", dest="dups", default=True, help="...") 
parser.add_option("-u", action="store_true", dest="donotsort", default=False, help="...") 

options, args = parser.parse_args(sys.argv[2:]) 

xcol1=options.xcol1 
xcol2=options.xcol2 
dups=options.dups 
donotsort=options.donotsort 


print "xcol1:" 
print xcol1 
print "xcol 2:" 
print xcol2 
print "dups:" 
print dups 
print "donotsort:" 
print donotsort 
print args 
... 
... 
... 

L'exécution de la commande aformentioned avec la sortie volonté de code ci-dessus:

vrai

Faux

vrai

vrai

test, test2

c'est-à-dire les valeurs par défaut. Il devrait vraiment sortir "Faux, Faux, Vrai, Vrai, ...), puisque les options 1, 2, et vous sont activées" Qu'est-ce que je fais mal? Est-ce quelque chose à voir avec l'analyseur, parce que je ne suis pas . 100% sûr que je suis en utilisant l'analyseur correctement

de plus, lorsque je liste les options comme -12u au lieu de -1 -2 -u, il se comporte différemment - les valeurs booléennes sont différentes

+0

Pourquoi cela fonctionnerait-il comme prévu? Vous avez fait '-12u' au lieu de' -1 -2 -u' – Navith

+0

Ok, je l'ai changé en -1 -2 -u et maintenant la sortie est True, False, True, True - cependant, la première option devrait être False . En outre, je pensais que les espaces entre les options séparées n'était pas nécessaire – gallardoelise

+2

Modifier 'sys.argv [2:]' à 'sys.argv [1:]' – Navith

Répondre

1

devrait être

options, args = parser.parse_args() 

Aussi ajouter:

print options 

Résultats dans:

xcol1: 
True 
xcol 2: 
True 
dups: 
True 
donotsort: 
False 
['test', 'test2'] 
{'dups': True, 'donotsort': False, 'xcol2': True, 'xcol1': True} 

Explication:

sys.argv est une liste, quelque chose comme [{myScript.py}, {...} args]. Par conséquent, sys.argv [2:] se débarrasse de vos drapeaux.

Vu:

import sys 
print sys.argv 

Résultats:

>>> python showArgs.py -12u 
>>> ['showArgs.py', '-12u'] 

En outre, selon the official docs, optparse est dépréciée en faveur de argparse.

+0

'argparse' est 3.2+ et OP utilise 2.x – Navith

+0

@Navith argparse est aussi disponible en 2.7: https://docs.python.org/2/howto/argparse.html Ou, en <2.7 ou <3.2 via pip: https://pypi.python.org/pypi/argparsel http://stackoverflow.com/questions/15330175/how-can-i-get-argparse-in -python-2-6 – dantiston