Прапор командного рядка 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 досить непрозорим у цьому питанні.


4
Якщо ви просто хочете, щоб ваш сценарій 1 прапор, sys.argv було б набагато простіше. Якщо ви спеціально не намагаєтеся навчитися аргументувати, що добре, оскільки його зручний модуль знати.
човен

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.


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

-10

Ось швидкий спосіб зробити це, крім цього нічого не знадобиться sys.. хоча функціональність обмежена:

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

[1:] є у випадку, якщо повне ім'я файлу --flag


13
Просто увійдіть в систему, щоб висловити, наскільки BAD ідея в довгостроковій перспективі. Уявіть, що ви починаєте, перевіряючи, чи є рядок "--flag" у sys.argv. Потім ви дивитеся в кінці sys.argv [-1], щоб побачити, який файл відкрити. Раптом у вас опинилася ситуація, коли, якщо ви спробуєте відкрити файл з назвою --flag, то він поводитиметься несподівано, і що ще гірше, це те, що це часто виявляється вадою безпеки в дорозі, коли ненадійні дані виявляються перейшов до аргв. Зрештою, цей метод просто не слід робити. Справжні арсенальні аналізатори просто набагато надійніші ...
timthelion

3
Як згадувалося, це рішення зовсім не надійне, але воно працює, якщо це потрібно зробити дуже швидко (наприклад, для тестування). Однозначно тримайте його подалі від виробничого коду.
Джонатан Судяман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.