web-dev-qa-db-ja.com

必要なサブコマンドを使用したargparse

Pythonのargparseを使用して、サブコマンドを必須の引数にするにはどうすればよいですか?サブコマンドが指定されていない場合にargparseでエラーが発生するため、これを実行します。代わりに、エラーメソッドをオーバーライドしてヘルプを出力します。私は3つの深さのネストされたサブコマンドを持っているので、トップレベルでゼロ引数を処理するだけの問題ではありません。

次の例では、これがそのように呼び出された場合、次のようになります。

$./simple.py
$

代わりに私がしたいのは、argparseが必要なサブコマンドが指定されていないと文句を言うことです。

import argparse

class MyArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        self.print_help(sys.stderr)
        self.exit(0, '%s: error: %s\n' % (self.prog, message))

def main():
    parser = MyArgumentParser(description='Simple example')
    subs = parser.add_subparsers()
    sub_one = subs.add_parser('one', help='does something')
    sub_two = subs.add_parser('two', help='does something else')

    parser.parse_args()

if __name__ == '__main__':
    main()
32
PonyEars

必要な引数のエラーメッセージに3.3の変更があり、サブコマンドがほこりの中で失われました。

http://bugs.python.org/issue9253#msg186387

そこで、requiredが定義された後にsubparsers属性を設定して、この回避策を提案します。

parser = ArgumentParser(prog='test')
subparsers = parser.add_subparsers()
subparsers.required = True
subparsers.dest = 'command'
subparser = subparsers.add_parser("foo", help="run foo")
parser.parse_args()

更新

関連するプルリクエスト: https://github.com/python/cpython/pull/3027

52
hpaulj

hpauljの回答 に加えて:requiredキーワード引数を ArgumentParser.add_subparsers() と一緒に使用することもできますPython 3.7。また、引数としてdestを渡す必要があります。そうしないと、エラーが発生します:TypeError: sequence item 0: expected str instance, NoneType found

ファイルexample.py

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command', required=True)
foo_parser = subparsers.add_parser("foo", help="command foo")
args = parser.parse_args()

引数なしの呼び出しの出力

$ python example.py
usage: example.py [-h] {foo} ...
example.py: error: the following arguments are required: command
2
Henrik

required=Trueを使ってみませんか?詳細 ここ

0
Joseph Dunn

dest引数を使用できます。これは、 add_subparsers() のドキュメントの最後の例に記載されています。

# required_subparser.py
import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subparser_name')
one = subparsers.add_parser('one')
two = subparsers.add_parser('two')

args = parser.parse_args()

Python 2.7:

$python required_subparser.py 
usage: required_subparser.py [-h] {one,two} ...
required_subparser.py: error: too few arguments
$python required_subparser.py one
$# no error
0
Bakuriu