2013-07-02 51 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