仅使用一个命令行参数的argparse

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)

一个参数表示期望的结果:

./test.py -o file1
file1

当参数重复时,第一次出现会被默默忽略:
./test.py -o file1 -o file2
file2

我也尝试了nargs=1action='store',但没有达到期望的结果。

我该如何告诉argparse拒绝多个参数出现?


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

您可以只一次指定-o
% script.py -o file1 
file1

但是如果指定了两个-o参数,会引发错误:

% script.py -o file1 -o file2
usage: script.py [-h] [-o OUTFILE]
script.py: error: -o can only be specified once

谢谢 - 工作正常。我一直在寻找argparse内的解决方案,所以我忽略了自定义Action方法。 - sd2k9
我会在检查中添加默认值,if getattr(namespace, self.dest) is not None and self.default is None: 因为如果您指定了默认值,它将失败,而不是因为参数重复。 - lasote
@lasote:我认为使用该条件将允许多次指定“-o”而不会引发错误,因为如果您指定非None的默认值,则self.default将不是None。我已更改上面的代码以适应不同方式的默认值。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接