2015-04-19 6 views
1

Я написал функцию, которая принимает до 4 опций и 2 аргумента. Возможные значения: -1, -2, -3 и -u. По умолчанию их значения равны true, true, true и false, соответственно, но включение любого из параметров приводит к переводу значения. Проблема заключается в том, даже если я указываю, скажем,Python optparse не принимает параметры

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

и печати значений опцию, они до сих пор показывают значения по умолчанию. Ниже приводится соответствующая часть моего кода:

... 
... 
... 
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 
... 
... 
... 

Выполнение упомянутых выше команд с выводом выше код будет:

Истинного

Ложные

Правда

Правда

тест, тест2

т. Е. Значения по умолчанию. Это действительно должно выводить «False, False, True, True, ...), поскольку опции 1, 2 и u включены. Что я делаю неправильно? Это как-то связано с парсером, потому что я не . 100% уверен, что я использую парсер правильно

Кроме того, когда я перечисляю варианты, как -12u вместо -1 -2 -u, он ведет себя по-разному - булевы значения отличаются

+0

Зачем это работает так, как вы ожидали? Вы делали '-12u' вместо' -1 -2 -u' – Navith

+0

Хорошо, я изменил его на -1 -2 -u, и теперь вывод True, False, True, True - однако первый вариант должен быть False , Кроме того, я думал, что пробелы между отдельными опциями не нужны – gallardoelise

+2

Измените 'sys.argv [2:]' на 'sys.argv [1:]' – Navith

ответ

1

Должно быть

options, args = parser.parse_args() 

Также добавьте в:

print options 

Результаты в:

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

Разъяснение:

sys.argv список, что-то вроде [{myScript.py}, {арг ...}]. Поэтому sys.argv [2:] избавляется от ваших флагов.

Дано:

import sys 
print sys.argv 

Результаты:

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

Кроме того, в соответствии с the official docs, optparse осуждается в пользу argparse.

+0

'argparse' - 3.2+, а OP использует 2.x – Navith

+0

@Navith argparse также доступен в 2.7: https://docs.python.org/2/howto/argparse.HTML Или в <2,7 или <3,2 через пип: https://pypi.python.org/pypi/argparsel http://stackoverflow.com/questions/15330175/how-can-i-get-argparse-in -python-2-6 – dantiston

Смежные вопросы