Документация для argparse модуля питона , в то время как отлично я уверен, это слишком много для меня крошечный начинающего мозга , чтобы понять прямо сейчас. Мне не нужно делать математику в командной строке или вмешиваться в форматирование строк на экране или изменять параметры символов. Все, что я хочу сделать, это «Если arg - A, сделайте это, если B сделает это, если ни один из вышеперечисленных не показывает помощь и выход» .
529
sys.argv
аргумент, который вы хотите ...Ответы:
Мое понимание исходного вопроса двоякое. Во-первых, с точки зрения простейшего возможного примера argparse, я удивлен, что не видел его здесь. Конечно, чтобы быть простым, это также накладные расходы с небольшой силой, но это может помочь вам начать.
Но этот позиционный аргумент теперь необходим. Если вы пропустите это при вызове этой программы, вы получите ошибку об отсутствующих аргументах. Это приводит меня ко второй части оригинального вопроса. Мэтт Вилки, кажется, хочет один дополнительный аргумент без именованной метки (метки --option). Мое предложение будет изменить приведенный выше код следующим образом:
Возможно, есть более элегантное решение, но оно работает и является минималистским.
источник
Вот как я это делаю
argparse
(с несколькими аргументами):args
будет словарь, содержащий аргументы:В вашем случае просто добавьте только один аргумент.
источник
foo.py --action install
илиfoo.py --action remove
вместо этого простоfoo.py install
parser.add_argument('install', help='Install the app')
(Обратите внимание, что вы не можете определить позиционный аргумент с помощьюrequired=True
)args
был создан диктат, как указано выше.args.foo
иargs.bar
вместо синтаксиса словаря. В любом случае это нормально, но args - это не словарь, аargparse.Namespace
объект.argparse
Документация достаточно хорошо , но оставляет несколько полезных деталей , которые не могут быть очевидны. (@Diego Navarro уже упоминал кое-что из этого, но я постараюсь немного расширить его ответ.) Основное использование выглядит следующим образом:Возвращаемый вами объект
parse_args()
- это объект «Пространство имен»: объект, переменные-члены которого названы в соответствии с аргументами командной строки.Namespace
Объект как получить доступ к аргументам и значению , связанное с ними:(Обратите внимание, что
argparse
в именах аргументов «-» заменяется подчеркиванием при именовании переменных.)Во многих ситуациях вы можете использовать аргументы просто как флаги, которые не имеют значения. Вы можете добавить их в argparse следующим образом:
Выше будут созданы переменные с именем 'foo' со значением True и 'no_foo' со значением False соответственно:
Также обратите внимание, что вы можете использовать опцию «required» при добавлении аргумента:
Таким образом, если вы пропустите этот аргумент в командной строке,
argparse
он сообщит вам, что он отсутствует, и остановит выполнение вашего скрипта.Наконец, обратите внимание, что с помощью функции можно создать сложную структуру ваших аргументов
vars
, если это облегчит вам жизнь.Как вы видете,
vars
возвращает dict с именами аргументов в качестве ключей и их значениями в качестве значений.Есть много других опций и вещей, которые вы можете сделать, но это должно охватывать наиболее важные, распространенные сценарии использования.
источник
'-f'
и'-b'
? Почему ты не можешь опустить это?man cp
или,man ls
и вы обнаружите, что много вариантов входят в обоих вариантах (например-f, --force
). Вероятно, существуют различные причины, по которым люди предпочитают одну или другую, но в любом случае достаточно стандартно сделать обе формы доступными в вашей программе.Мэтт спрашивает о позиционных параметрах в argparse, и я согласен, что в документации по Python по этому аспекту не хватает. На ~ 20 нечетных страницах нет ни одного полного примера, показывающего как синтаксический анализ, так и использование позиционных параметров .
Ни один из других ответов здесь не показывает полный пример позиционных параметров, так что вот полный пример:
Меня поразило то, что argparse преобразует именованный аргумент "--foo-bar" в "foo_bar", но позиционный параметр с именем "foo-bar" остается как "foo-bar", что делает его менее очевидным, как используйте это в своей программе.
Обратите внимание на две строки в конце моего примера - ни одна из них не сработает, чтобы получить значение позиционного параметра foo-bar. Первое явно неверно (это арифметическое выражение args.foo минус бар), но второе тоже не работает:
Если вы хотите использовать
foo-bar
атрибут, вы должны использоватьgetattr
, как показано в последней строке моего примера. Сумасшествие заключается в том, что если вы попытаетесьdest=foo_bar
изменить имя свойства на что-то более простое, вы получите действительно странное сообщение об ошибке:Вот как работает приведенный выше пример:
источник
nargs='?'
это заклинание для «необязательного позиционирования» согласно stackoverflow.com/questions/4480075/…foo-bar
не преобразован,foo_bar
рассматривается в bugs.python.org/issue15125 .print args.foo_bar
работает. Поскольку это позиционный аргумент, вам не нужно указывать имя при вызове скрипта, поэтому для пользователя это не имеет значения.getattr
(он также более гибок, так как позволяет изменять аргумент с необязательного на позиционный без изменения кода, использующего значение).Еще одно краткое введение, вдохновленное этим постом .
Аргументы определяются с помощью следующих комбинаций:
Общие варианты:
--help
использовании.float
илиint
(иначеstr
).'-x', '--long-name', dest='longName'
).Примечание: по умолчанию
--long-name
доступ осуществляется сargs.long_name
store_true, store_false
: для логических аргументов'--foo', action='store_true' => args.foo == True
store_const
: для использования с опциейconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: для повторных вариантов, как в./myscript.py -vv
'-v', action='count' => args.v == 2
append
: для повторных вариантов, как в./myscript.py --foo 1 --foo 2
'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
).источник
Обратите внимание на учебник по Argparse в Python HOWTO . Это начинается с большинства основных примеров, таких как этот:
и прогрессирует до менее основных.
Есть пример с предопределенным выбором для опции, например, что спрашивается:
источник
Вот что я придумал в своем учебном проекте, в основном благодаря @DMH ...
Демо-код:
Это, возможно, развивалось и доступно онлайн: command-line.py
Скрипт для тренировки этого кода: command-line-demo.sh
источник
Вы также можете использовать plac (обертку вокруг
argparse
).В качестве бонуса он генерирует аккуратные справочные инструкции - см. Ниже.
Пример скрипта:
Пример вывода:
Аргументы не предоставлены -
example.py
:Неожиданный аргумент предоставлен -
example.py C
:Правильный аргумент предоставлен -
example.py A
:Меню полной справки (генерируется автоматически) -
example.py -h
:Краткое объяснение:
Имя аргумента обычно равно имени параметра (
arg
).Аннотация кортежа после
arg
параметра имеет следующее значение:Argument with two possible values
)positional
)None
)None
)['A', 'B']
)Документация:
Чтобы узнать больше об использовании plac, ознакомьтесь с его великолепной документацией:
источник
Чтобы добавить к тому, что заявили другие:
Мне обычно нравится использовать параметр 'dest', чтобы указать имя переменной, а затем использовать 'globals (). Update ()', чтобы поместить эти переменные в глобальное пространство имен.
Применение:
Код:
источник
argparse
используетgetattr
иsetattr
для доступа к значениям в пространстве имен. Таким образом, это не беспокоит странно сформированныеdest
ценности.Действительно простой способ использования argparse и изменения ключей '-h' / '--help' для отображения ваших собственных справочных инструкций по коду - установить для справки по умолчанию значение False, вы также можете добавить столько дополнительных .add_arguments, сколько пожелаете. :
Запустите: python test.py -h
Вывод:
источник
Самый простой ответ!
PS тот, кто написал документ argparse, глуп
код Python:
бегущий код
источник