web-dev-qa-db-ja.com

python argparse:エラー時にヘルプを自動的に表示するにはどうすればよいですか?

現在、無効なオプションを入力したり、位置引数を省略したりすると、argparseはプロンプトに戻り、アプリの使用状況を表示します。これは問題ありませんが、ユーザーに入力を要求するよりも、完全なヘルプリスト(オプションなどを説明する)を自動的に表示したいと思います。

./myscript.py -h

ありがとう!

ジェイミー

24
jpswain.w

この thread Googleグループでは、次のコードスニペットがあり、トリックを実行しているようです(わずかに変更されています)。

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

ヘルプを印刷するには、次のように使用します。ArgumentParserインスタンスの_print_help_関数

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

エラー時にヘルプメッセージを出力するには、error()メソッドをオーバーライドするArgumentParserインスタンスの独自のサブクラスを作成する必要があります。たとえば、次のようになります。

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

このパーサーが解析不可能な引数行に遭遇すると、ヘルプを出力します。

31
jb.

また、クラスや例外を使用せずにヘルプを印刷することもできます。

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

0
Maxim Temny

usage=argparse.SUPPRESSで使用法の印刷を抑制します。次に、ArgumentParserがエラー時に発生するSystemExit例外をキャッチし、ヘルプを出力して、例外を再度発生させて終了します。

parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
parser.add_argument(...)
try:
    args = parser.parse_args()
except SystemExit:
    parser.print_help()
    raise
0
Roger Dahl