2013-02-16 19 views
4

我想用argparse实现一个只有一个或一个被接受的方式的命令行参数。应该拒绝多次发生。只有一个命令行参数与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拒绝多个参数发生?

回答

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 
+0

谢谢 - 按预期工作。我在argparse中寻找解决方案,这就是为什么我忽略了自定义Action方法。 – sd2k9 2013-02-17 14:46:36

+0

我会添加到检查默认值,如果getattr(名称空间,self.dest)不是None和self.default是None:'因为如果你指定一个默认值,它会失败,而不是因为参数重复。 – lasote 2017-11-02 08:25:32

+0

@lasote:我认为使用这个条件将允许'-o'被多次指定而不会引发错误,因为如果指定非None默认值,'self.default'将不会是'None'。我已经改变了上面的代码以适应上面的不同方式的默认值。 – unutbu 2017-11-02 11:59:29