web-dev-qa-db-ja.com

argparse:どのサブパーサーが使用されたかを特定します

これは簡単なはずだと思いますが、わかりません。

次のパーサーパーサーがあると仮定します。

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')

どのサブパーサーが使用されたかを特定するにはどうすればよいですか?呼び出し:

print parser.parse_args(["all"])

空の名前空間を提供します:

Namespace()
136
user1062880

編集:この質問の quornian's answer を参照してください。

argparse documentation によれば、parser.parse_args(...)の結果は「選択されたメインパーサーとサブパーサーの属性のみを含む」ことになります。残念ながら、これはどのサブパーサーが使用されたかを判断するのに十分な情報ではないかもしれません。この問題を解決するには、サブパーサーで set_defaults(...) メソッドを使用することをドキュメントで推奨しています。

たとえば、コードにset_defaults()の呼び出しを追加しました。

_import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')
_

今実行すると

_print parser.parse_args(["all"])
_

結果は

_Namespace(which='all')
_

詳細と別の例については、 add_subparsers() のドキュメントをご覧ください。

68
srgerg

より簡単な解決策は、destadd_subparsers呼び出しに追加することです。これは documentation の少し下に埋まっています:

[...]呼び出されたサブパーサーの名前を確認する必要がある場合、add_subparsers()呼び出しのdestキーワード引数が機能します

あなたの例で置き換えます:

subparsers = parser.add_subparsers(help='commands')

で:

subparsers = parser.add_subparsers(help='commands', dest='command')

今実行すると:

print parser.parse_args(["all"])

あなたは得るでしょう

Namespace(command='all')
260
quornian