2013-07-02 52 views
2

命令行参数,我想我的Python程序来解析命令喜欢这样的论点:解析与argparse

python dosomething.py z a1 b1 a2 b2 ... 

在那里我可以有任意数量#B#对和Z是一个不相关的数字。如有必要,我可以指定a和b对的数量。我正在使用argparse

+1

我想你可以读取的z,并把它弄出来的方式,然后读取的参数,以便休息(http://stackoverflow.com/questions/9027028/argparse-argument-order)和错误出如果他们的人数是奇数。 – approxiblue

+2

你应该可以使用''nargs ='+'''读取其余的内容,然后可以使用自定义操作来检查偶数对。并作为@deshko提到的第一个位置参数可以指定为z与''nargs = 1'' 检查http://stackoverflow.com/questions/13174975/argparse-doesnt-check-for-positional-arguments为关于nargs的选择 – goofd

回答

3

您需要为这种专门行为定义custom action

import sys 
import argparse 

class AbsAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     if len(values) % 2 == 0: 
      # If valid, store the values. 
      setattr(namespace, self.dest, values) 

      # You could convert the flat list to a list of 2-tuples, if needed: 
      # zip(values[::2], values[1::2]) 
     else: 
      # Otherwise, invoke a parser error with a message. 
      parser.error('abs must be supplied as pairs') 


ap = argparse.ArgumentParser() 
ap.add_argument('z') 
ap.add_argument('abs', nargs = '+', action = AbsAction) 
opt = ap.parse_args() 
print opt 
+0

谢谢,我用一个小小的黑客来解析'a''b'组合,现在错误得到妥善处理。 – deltap

0
import sys 

def main(args): 
    print args[0] 
    print len(args) 
    print [arg for arg in args] 

if __name__ == '__main__': 
    main(sys.argv) 
+0

谢谢你的建议,如果可能,我想坚持使用argparse。 – deltap