18

コード例を次に示します。

import argparse

parser=argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparser=parser.add_subparser()
a=subparser.add_parser('run')
a.add_argument('required_sub_arg')
a.add_argument('arg_a')
b=subparser.add_parser('b')
parser.parse_args()

-main_arg入ったら読み込んでほしいprogram run required_sub_arg -main_arg -arg_a

現在、-main_arg有効な引数として認識されていません。

4

2 に答える 2

11

最近の読者への PSA

この質問は 2018 年にもまだ訪問されているため、argparse でこの複雑なことを行う前に、代わりにdocoptまたはclickの使用を検討してください。これにより、あなたの正気と、あなたのコードを読んだり変更したりする可能性のある人の正気が向上します。ありがとうございました。

元の答え

現状では、いくつかの問題があります。

まず、parser.parse_argsは の引数の名前空間を返すメソッドparserなので、次のようにする必要があります。

args = parser.parse_args()

次に、次のような呼び出しargs.main_argsから取得します-main_arg

program -main_arg run required_sub_arg -arg_a

あなたの問題は、 namedmain_argへの引数を作成し、次のような呼び出しを行うことですparsermain_arg

program run required_sub_arg -main_arg -arg_a

aこれはnamedへの引数を参照しますmain_argaにはそのような引数がないため、無効です。

サブパーサーの 1 つからパーサーの引数を参照するには、そのサブパーサーにその親の引数を継承させる必要があります。これは

a=parser.add_subparser('run', parents=[parser])

サブパーサーを子パーサーと間違えました。詳細については、 http://docs.python.org/dev/py3k/library/argparse.htmlおよびhttps://code.google.com/p/argparse/issues/detail?id=54を参照してください。

于 2011-08-15T16:12:45.377 に答える