Python optparse не принимает параметры

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

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, они ведут себя по-другому - логические значения различны.


person gallardoelise    schedule 19.04.2015    source источник
comment
Почему это должно работать так, как вы ожидали? Вы сделали -12u вместо -1 -2 -u   -  person Navith    schedule 19.04.2015
comment
Хорошо, я изменил его на -1 -2 -u, и теперь вывод True, False, True, True - однако первый вариант должен быть False. Кроме того, я думал, что пробелы между отдельными параметрами не нужны.   -  person gallardoelise    schedule 19.04.2015
comment
Изменить sys.argv[2:] на sys.argv[1:]   -  person Navith    schedule 19.04.2015
comment
@gallardoelise Получили ли вы ответ на свой вопрос?   -  person dantiston    schedule 12.05.2015


Ответы (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}, {args...}]. Поэтому sys.argv[2:] избавляется от ваших флагов.

Дано:

import sys
print sys.argv

Полученные результаты:

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

Кроме того, согласно официальной документации, optparse устарел в пользу argparse.

person dantiston    schedule 19.04.2015
comment
argparse — это 3.2+, а OP использует 2.x - person Navith; 20.04.2015
comment
@Navith argparse также доступен в версии 2.7: docs.python.org/2/howto/argparse. .html Или в версии 2.7 или 3.2 через pip: pypi.python.org/pypi /argparsel stackoverflow.com/questions/15330175/ - person dantiston; 20.04.2015