Этот ответ приходит от Стивена Бетарда из групп Google . Я размещаю его здесь, чтобы облегчить доступ людям без учетной записи Google.
Вы можете переопределить поведение error
метода по умолчанию :
import argparse
import sys
class MyParser(argparse.ArgumentParser):
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()
Обратите внимание, что вышеупомянутое решение будет печатать сообщение справки всякий раз, когда error
метод запускается. Например, test.py --blah
напечатать сообщение справки тоже, если --blah
не является допустимым вариантом.
Если вы хотите напечатать сообщение справки только в том случае, если в командной строке не указаны аргументы, возможно, это все еще самый простой способ:
import argparse
import sys
parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
parser.print_help(sys.stderr)
sys.exit(1)
args=parser.parse_args()
Обратите внимание, что parser.print_help()
по умолчанию печатается в стандартный вывод. Как предполагает init_js , используйте parser.print_help(sys.stderr)
для печати в stderr.
parser.print_usage()
вместоparser.print_help()
- сообщение помощи включает использование, но оно более многословно.error()
кажется мне ужасной идеей. Он служит для другой цели, он не предназначен для печати в дружественной форме или помощи.Вместо написания класса можно использовать попытку / исключение
Плюс в том, что рабочий процесс более понятен, и вам не нужен класс-заглушка. Недостатком является то, что первая строка «использования» печатается дважды.
Для этого потребуется как минимум один обязательный аргумент. Без обязательных аргументов, предоставление нулевых аргументов в командной строке является допустимым.
источник
-h
используется флаг, и ненужные печатает справку, если--version
используется флаг. Чтобы смягчить эти проблемы, вы можете проверить тип ошибки следующим образом:except SystemExit as err: if err.code == 2: parser.print_help()
С argparse вы можете сделать:
источник
parser.parse_args()
Если у вас есть аргументы, которые должны быть указаны для запуска скрипта - используйте обязательный параметр для ArgumentParser, как показано ниже: -
parse_args () сообщит об ошибке, если скрипт запущен без каких-либо аргументов.
источник
Если вы связываете функции по умолчанию для (под) парсеров, как упомянуто ниже
add_subparsers
, вы можете просто добавить их как действие по умолчанию:Добавьте попытку, кроме случаев, когда вы вызываете исключения из-за отсутствия позиционных аргументов.
источник
Самым чистым решением будет передача аргумента по умолчанию вручную, если в командной строке не было указано ни одного:
Полный пример:
Это напечатает полную справку (не короткое использование), если вызвано без аргументов.
источник
sys.argv[1:]
это очень распространенная идиома. Вижуparser.parse_args(None if sys.argv[1:] else ['-h'])
идиоматичнее и чище.Бросаю мою версию в кучу здесь:
Вы можете заметить
parser.exit
- я в основном так делаю, потому что это сохраняет строку импорта, если это было единственной причинойsys
в файле ...источник
not vars(args)
может не работать, когда аргументы имеютdefault
метод.Есть пара однострочников с
sys.argv[1:]
(очень распространенная идиома Python для ссылки на аргументы командной строки, являющаясяsys.argv[0]
именем скрипта), которые могут сделать эту работу.Первый говорит само за себя, чисто и питонно:
Второй немного хакерский. Сочетание ранее оцененный факт , что пустой список
False
сTrue == 1
иFalse == 0
эквивалентностями вы получите это:Может быть, слишком много скобок, но довольно ясно, если был сделан предыдущий выбор аргумента.
источник
parser.exit
Метод также может принятьstatus
( код возврата), аmessage
значение (включить концевую строку самостоятельно!).пример самоуверенный, :)
Пример звонков:
источник
Установите ваши позиционные аргументы с помощью nargs и проверьте, не являются ли позиционные аргументы пустыми.
Ссылки на Python Nargs
источник
Вот еще один способ сделать это, если вам нужно что-то гибкое, где вы хотите отобразить справку, если переданы определенные параметры, ни одного вообще или более 1 конфликтующего аргумента:
Ура!
источник
Если в вашей команде пользователю нужно выбрать какое-либо действие, используйте взаимоисключающую группу с required = True .
Это своего рода расширение ответа, данного pd321.
Вывод:
Это только дать основную помощь. И некоторые другие ответы окажут вам полную помощь. Но, по крайней мере, ваши пользователи знают, что они могут сделать -h
источник
Это не хорошо (также, потому что перехватывает все ошибки), но:
Вот определение
error
функцииArgumentParser
класса:https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
, Как видите, после подписи требуется два аргумента. Однако функции вне класса ничего не знают о первом аргументе:
self
потому что, грубо говоря, это параметр для класса. (Я знаю, что вы знаете ...) Таким образом, просто пройти самостоятельноself
иmessage
в_error(...)
не может (будет выводить:
). Вы можете передать
parser
(self
) в_error
функцию, вызвав ее:, но вы не хотите выходить из программы прямо сейчас. Затем верните это:
, Тем
parser
не менее, не знает, что оно было модифицировано, поэтому при возникновении ошибки он отправит причину этого (кстати, его локализованный перевод). Ну, тогда перехватите это:, Теперь, когда ошибка произойдет и
parser
отправит причину, вы перехватите ее, посмотрите на это и ... выбросите.источник