5

何も受け入れられないか、一度だけ受け入れられるように、argparseを使用してコマンドライン引数を実装しようとしています。複数回発生する場合は拒否する必要があります。

私は次のコードを使用します

#!/usr/bin/env python3
import argparse
cmd_parser = argparse.ArgumentParser()
cmd_parser.add_argument('-o', dest='outfile')
cmd_line = cmd_parser.parse_args()
print(cmd_line.outfile)

1つの引数は、期待される結果を示します。

./test.py -o file1
file1

引数を2回発行すると、最初の発生は黙って無視されます。

./test.py -o file1 -o file2
file2

私も試しnargs=1てみaction='store'ましたが、望ましい結果は得られませんでした。

複数の引数の出現を拒否するようにargparseに指示するにはどうすればよいですか?

4

1 に答える 1

7

カスタムアクションでアレンジすることができます:

import argparse

class Once(argparse.Action):
    def __init__(self, *args, **kwargs):
        super(Once, self).__init__(*args, **kwargs)
        self._count = 0

    def __call__(self, parser, namespace, values, option_string=None):
        # print('{n} {v} {o}'.format(n=namespace, v=values, o=option_string))
        if self._count != 0:
            msg = '{o} can only be specified once'.format(o=option_string)
            raise argparse.ArgumentError(None, msg)
        self._count = 1
        setattr(namespace, self.dest, values)

cmd_parser = argparse.ArgumentParser()
cmd_parser.add_argument('-o', dest='outfile', action=Once, default='/tmp/out')
cmd_line = cmd_parser.parse_args()
print(cmd_line.outfile)

デフォルトを指定できます。

% script.py 
/tmp/out

-o1回指定できます。

% script.py -o file1 
file1

ただし、-o2回指定すると、エラーが発生します。

% script.py -o file1 -o file2
usage: script.py [-h] [-o OUTFILE]
script.py: error: -o can only be specified once
于 2013-02-16T23:02:04.153 に答える