11

Python で argparse モジュールを使用して、コマンド ライン インターフェイスで入力されたパラメーターを解析しています。サブパーサー オブジェクトへの次の add_argument 呼び出しがあります。

submit_parser.add_argument('-pv','--provision',metavar='PROVISION', dest='PROVISION',
                                 help='provision system',
                                 action='store_true', default=False, required=False)

次のエラーが表示されます。

Traceback (most recent call last):
  File "./scripts/tp4", line 94, in <module> 
    main()
  File "./scripts/tp4", line 74, in main 
    modloader.loadModules(sub_parsers)
  File "/usr/lib/python2.6/site-packages/tp4/cli/Moduleloader.py", line 66, in loadModules 
    registered_modules[module_name].setSubparserArgs(module_sub_parser)
  File "/usr/lib/python2.6/site-packages/tp4/cli/modules/AutotestModule.py", line 135, in setSubparserArgs
    action='store_true', default=False, required=False)
  File "/usr/share/tp4/cli/zip/argparse.zip/argparse.py", line 1302, in add_argument
    TypeError: __init__() got an unexpected keyword argument 'metavar'

action または metavar パラメータを削除すると、機能します。なぜ両方一緒にできないのですか?http://docs.python.org/dev/library/argparse.htmlの argparse ドキュメントには、この制限について何もありません。

助けてくれてありがとう

4

2 に答える 2

19

metavar は、位置引数 (コマンド ラインの末尾にあるファイル名を考えてください)、または引数が独自の引数を取る場合 ( など--input-files foo.txt bar.txt) にのみ意味があります。

を に設定したため、引数--provisionはフラグです。引数はありません (つまり、設定されていません)。そのため、メタバーを持つことは意味がありません。actionstore_truenargs

ドキュメントから:_argparse

ヘルプ メッセージを生成するときArgumentParser、予想される各引数を参照する何らかの方法が必要です。デフォルトでは、ArgumentParserオブジェクトは dest 値を各オブジェクトの「名前」として使用します。デフォルトでは、位置引数アクションの場合は dest 値が直接使用され、オプションの引数アクションの場合は dest 値が大文字になります。そのため、 の単一の位置引数はdest='bar'bar と呼ばれます。--foo単一のコマンドライン引数が続く必要がある単一のオプションの引数は、FOO と呼ばれます。

于 2012-08-17T04:01:48.487 に答える
1

@pwc から回答を抽出するには、dest代わりにを使用する必要がありますmetavar

于 2015-06-04T19:24:37.113 に答える