2013-02-16 44 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