python argparse: как я могу автоматически отображать справку при ошибке?

В настоящее время, когда я ввожу недопустимые параметры или опускаю позиционные аргументы, argparse возвращает меня к подсказке и отображает использование для моего приложения. Это нормально, но я бы предпочел автоматически отображать полный список справки (в котором объясняются параметры и т. д.), чем требовать от пользователя ввода

./myscript.py -h

Спасибо!

Джейми


person jpswain.w    schedule 03.09.2010    source источник
comment
см. также этот вопрос SO для получения дополнительной информации: [stackoverflow.com/questions/4042452][1] [1] : stackoverflow.com/questions/4042452   -  person jpoppe    schedule 21.02.2012


Ответы (5)


Эта тема в группах Google содержит следующее фрагмент кода, который, кажется, помогает (слегка изменен).

class DefaultHelpParser(argparse.ArgumentParser):
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.print_help()
        sys.exit(2)
person Community    schedule 03.09.2010
comment
Разве не имеет смысла использовать здесь self.print_help(sys.stderr)? - person hans_meine; 24.11.2014
comment
Если это не совсем понятно, вы должны использовать DefaultHelpParser вместо того, как вы обычно используете argparse.ArgumentParser после создания этого класса. - person Omer Tuchfeld; 05.03.2019

Чтобы распечатать справку, вы можете использовать: print_help функция на ArgumentParser экземпляре

parser = argparse.ArgumentParser()
(...)
parser.print_help()

Чтобы вывести справочное сообщение об ошибке, вам нужно создать собственный подкласс экземпляра ArgumentParser, который переопределяет метод error(). Например так:

class MyParser(argparse.ArgumentParser): 
   def error(self, message):
      sys.stderr.write('error: %s\n' % message)
      self.print_help()
      sys.exit(2)

Когда этот синтаксический анализатор встречает неразборчивую строку аргумента, он печатает справку.

person jb.    schedule 16.02.2013

Я только что сам исправил эту же проблему, используя следующий синтаксис:

parser = ArgumentParser()
... add arguments ...
parser.usage = parser.format_help()
args = parser.parse_args()
person infinitesteps    schedule 16.04.2020

Подавить печать использования с помощью usage=argparse.SUPPRESS. Затем перехватите исключение SystemExit, которое ArgumentParser вызывает при ошибке, распечатайте справку и выйдите, снова вызвав исключение.

parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
parser.add_argument(...)
try:
    args = parser.parse_args()
except SystemExit:
    parser.print_help()
    raise
person Roger Dahl    schedule 07.11.2019
comment
@GerhardBarnard Читайте :) - person Roger Dahl; 27.11.2019

Вы также можете распечатать справку без использования класса или исключения:

def _error(parser):
    def wrapper(interceptor):
        parser.print_help()

        sys.exit(-1)

    return wrapper

def _args_get(args=sys.argv[1:]):
    parser = argparser.ArgumentParser()

    parser.error = _error(parser)

    parser.add_argument(...)
    ...

. Просто оберните функцию ArgumentParser.error в свой аргумент и перехватите message. Я ответил, там, ранее:

https://stackoverflow.com/a/60714163/10152015

person hesed    schedule 17.03.2020