Python argparse флаги командной строки без аргументов

345

Как добавить необязательный флаг в мои аргументы командной строки?

например. так что я могу написать

python myprog.py 

или

python myprog.py -w

Я попытался

parser.add_argument('-w')

Но я просто получаю сообщение об ошибке, говорящее

Usage [-w W]
error: argument -w: expected one argument

это означает, что для параметра -w требуется значение аргумента. Какой способ просто принять флаг?

Я считаю, что http://docs.python.org/library/argparse.html довольно непрозрачен в этом вопросе.

Interstar
источник
4
Если вы просто хотите, чтобы в вашем скрипте был 1 флаг, sys.argv был бы намного проще. Если вы специально не пытаетесь изучать argparse, что хорошо, потому что это удобный модуль для изучения.
chown
2
Даже после того, как я знаю ответ сейчас, я не понимаю, как я мог понять его из документации.
Андреас Хефербург

Ответы:

533

Как вы понимаете, аргумент w ожидает значение после -w в командной строке. Если вы просто хотите переключиться, установив переменную Trueили False, взгляните на http://docs.python.org/dev/library/argparse.html#action (в частности store_true и store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

где action='store_true'подразумевается default=False.

И наоборот, вы могли бы иметь action='store_false', что подразумевает default=True.

Jdog
источник
3
@Jdog, есть идеи, почему это не работает для меня? Это wвсегда False.
Юлиан Онофрей
52

Добавление быстрого фрагмента, чтобы он был готов к выполнению:

Источник: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

Использование:

python myparser.py -w
>> True
user1767754
источник
-10

Вот быстрый способ сделать это, не требуя ничего кроме sys... хотя функциональность ограничена:

flag = "--flag" in sys.argv[1:]

[1:] в случае, если полное имя файла --flag

dbalagula23
источник
13
Просто вошли в систему, чтобы просто выразить, насколько ПЛОХАЯ идея в долгосрочной перспективе. Представьте, что вы начинаете с проверки, находится ли строка «--flag» в sys.argv. Затем вы смотрите в конец sys.argv [-1], чтобы увидеть, какой файл открыть. Внезапно вы --flagпопадаете в ситуацию, когда вы пытаетесь открыть файл с именем , тогда он будет вести себя неожиданно, и, что еще хуже, это то, что это часто оказывается недостатком безопасности в будущем, когда ненадежные данные оказываются перешел на аргв. В конце концов, этот метод просто не должен быть сделан. Реальные парсеры arg просто намного более устойчивы ...
timthelion 25.11.16
3
Как уже упоминалось, это решение совсем не надежно, но оно работает, если вам нужно сделать это очень быстро (например, в целях тестирования). Обязательно держите его подальше от производственного кода.
Джонатан Судиаман