11

明らかな何かが欠けているに違いありません。目標は、最初のパラメーターを必須、2 番目のパラメーターをオプション、その他の残りのパラメーターをオプションとして argparse を使用することです。

この問題を示すために、2 つのテスト パーサーを作成しました。それらの唯一の違いは、一方に nargs=argparse.REMAINDER を使用し、もう一方に nargs='*' を使用することです。

def doParser1(argsin):
    parser = argparse.ArgumentParser(description='Parser demo.')
    parser.add_argument('req1', help='first required parameter')
    parser.add_argument('--opt1', help='first optional parameter')
    parser.add_argument('leftovers', nargs=argparse.REMAINDER,
                    help='all the other parameters')
    argsout = parser.parse_args(args=argsin)
    print argsout
    return argsout

def doParser2(argsin):
    parser = argparse.ArgumentParser(description='Parser demo.')
    parser.add_argument('req1', help='first required parameter')
    parser.add_argument('--opt1', help='first optional parameter')
    parser.add_argument('leftovers', nargs='*',
                    help='all the other parameters')
    argsout = parser.parse_args(args=argsin)
    print argsout
    return argsout

余分なパラメーターがない場合、parser2 は機能します。これは、パーサー 1 とパーサー 1 が続く入力です。

input: ['req1value', '--opt1', 'opt1value']
Namespace(leftovers=['--opt1', 'opt1value'], opt1=None, req1='req1value')
Namespace(leftovers=None, opt1='opt1value', req1='req1value')

余分なパラメーターがある場合、opt1 の値が parser1 で失われ、parser2 が混乱するだけです。

input: ['req1value', '--opt1', 'opt1value', 'r1', 'r2']
Namespace(leftovers=['--opt1', 'opt1value', 'r1', 'r2'], opt1=None, req1='req1value')
usage: py-argparse.py [-h] [--opt1 OPT1]
                  [-leftovers [LEFTOVERS [LEFTOVERS ...]]]
                  req1
py-argparse.py: error: unrecognized arguments: r1 r2

予想される出力は次のようになります。

Namespace(leftovers=['r1', 'r2'], opt1='opt1value', req1='req1value')

これは単純なケースであるように思われ、ここにあるものは私が実際にやろうとしていることから単純化されています. 残り物をオプションにして、他のさまざまなオプションを追加しようとしましたが、何もうまくいきません.

どんな助けでも大歓迎です。

4

3 に答える 3

5

使用できますparse_known_args

import argparse
parser = argparse.ArgumentParser(description='Parser demo.')
parser.add_argument('req1', help='first required parameter')
parser.add_argument('--opt1', help='first optional parameter')

args, leftovers = parser.parse_known_args(['req1value', '--opt1', 'opt1value'])
print(args, leftovers)
# (Namespace(opt1='opt1value', req1='req1value'), [])

args, leftovers = parser.parse_known_args(['req1value', '--opt1', 'opt1value', 'r1', 'r2'])
print(args, leftovers)
# (Namespace(opt1='opt1value', req1='req1value'), ['r1', 'r2'])
于 2013-09-04T20:34:55.323 に答える