193

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

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

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()
4

2 に答える 2

362

より簡単な解決策はdestadd_subparsers呼び出しに追加することです。これは、ドキュメントの少し下に埋もれています:

[...] 呼び出されたサブパーサーの名前を確認する必要がある場合は、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')
于 2012-02-15T01:08:55.723 に答える
91

編集:この質問に対するクォーニアンの回答を参照してください。これは私のものよりも優れており、受け入れられる回答であるはずです。

argparseのドキュメントによると、結果に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()詳細と別の例については、ドキュメントを確認してください。

于 2011-11-23T22:48:44.117 に答える