Argparse 传递常量和变量
Argparse passing constants and variables
我正在尝试将 argparse 用于 SNMP (Nagios) 的可扩展解决方案。
我 运行 遇到的问题是试图让常量和变量通过 add_argument()
示例:
./SNMP.py -j 10 20 -l
-j 将存储 str ".1.5.5.8"
之后的参数将绕过 parser.add_argument()
中设置的默认值设置警告整数级别和临界整数级别
-l 会存储不同的 OID str 但会使用存储在 parser.add_argument()
中的默认警告和临界级别
谢谢!
简而言之,我必须解决这个难题的代码:
parser = argparse.ArgumentParser(description = "This is used to parse latency, jitter, and packet loss on an HDX")
parser.add_argument("-j", action = 'append', dest = 'jitter',
default = [".2.51.5.9.4","20 40"])
args = parser.parse_args()
warn, crit = args.jitter[-1].split()
In [16]: parser=argparse.ArgumentParser()
In [17]: parser.add_argument("-j", action = 'append', dest = 'jitter',
...: default = [".2.51.5.9.4","20 40"])
Out[17]: _AppendAction(option_strings=['-j'], dest='jitter', nargs=None, const=None, default=['.2.51.5.9.4', '20 40'], type=None, choices=None, help=None, metavar=None)
In [18]: parser.parse_args([])
Out[18]: Namespace(jitter=['.2.51.5.9.4', '20 40'])
In [19]: parser.parse_args(['-j','1'])
Out[19]: Namespace(jitter=['.2.51.5.9.4', '20 40', '1'])
因此 append
操作将 default
放入命名空间,并将 -j
提供的任何值附加到该列表。也可以重复 -j
,添加更多值。
有些人认为这是一个错误,应该将值附加到 []
,而默认值应该只出现 -j
根本不使用。当前的行为是简单且可预测的。
另一种方法是将默认值保留为 None
或 []
,如果 args.jitter
是 None
:[=25=,则在解析后自行添加默认值]
In [22]: parser.add_argument("-j", action = 'append', dest = 'jitter', nargs=2)
Out[22]: _AppendAction(option_strings=['-j'], dest='jitter', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [23]: parser.parse_args([])
Out[23]: Namespace(jitter=None)
In [24]: parser.parse_args(['-j','20','40'])
Out[24]: Namespace(jitter=[['20', '40']])
所以测试应该是这样的:
if args.jitter is None:
args.jitter= [...]
我添加了 nargs
以表明附加的是一个子列表。
有关使用默认值追加的更多讨论,请参阅 http://bugs.python.org/issue16399。
我正在尝试将 argparse 用于 SNMP (Nagios) 的可扩展解决方案。
我 运行 遇到的问题是试图让常量和变量通过 add_argument()
示例:
./SNMP.py -j 10 20 -l
-j 将存储 str ".1.5.5.8" 之后的参数将绕过 parser.add_argument()
中设置的默认值设置警告整数级别和临界整数级别-l 会存储不同的 OID str 但会使用存储在 parser.add_argument()
中的默认警告和临界级别谢谢!
简而言之,我必须解决这个难题的代码:
parser = argparse.ArgumentParser(description = "This is used to parse latency, jitter, and packet loss on an HDX")
parser.add_argument("-j", action = 'append', dest = 'jitter',
default = [".2.51.5.9.4","20 40"])
args = parser.parse_args()
warn, crit = args.jitter[-1].split()
In [16]: parser=argparse.ArgumentParser()
In [17]: parser.add_argument("-j", action = 'append', dest = 'jitter',
...: default = [".2.51.5.9.4","20 40"])
Out[17]: _AppendAction(option_strings=['-j'], dest='jitter', nargs=None, const=None, default=['.2.51.5.9.4', '20 40'], type=None, choices=None, help=None, metavar=None)
In [18]: parser.parse_args([])
Out[18]: Namespace(jitter=['.2.51.5.9.4', '20 40'])
In [19]: parser.parse_args(['-j','1'])
Out[19]: Namespace(jitter=['.2.51.5.9.4', '20 40', '1'])
因此 append
操作将 default
放入命名空间,并将 -j
提供的任何值附加到该列表。也可以重复 -j
,添加更多值。
有些人认为这是一个错误,应该将值附加到 []
,而默认值应该只出现 -j
根本不使用。当前的行为是简单且可预测的。
另一种方法是将默认值保留为 None
或 []
,如果 args.jitter
是 None
:[=25=,则在解析后自行添加默认值]
In [22]: parser.add_argument("-j", action = 'append', dest = 'jitter', nargs=2)
Out[22]: _AppendAction(option_strings=['-j'], dest='jitter', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [23]: parser.parse_args([])
Out[23]: Namespace(jitter=None)
In [24]: parser.parse_args(['-j','20','40'])
Out[24]: Namespace(jitter=[['20', '40']])
所以测试应该是这样的:
if args.jitter is None:
args.jitter= [...]
我添加了 nargs
以表明附加的是一个子列表。
有关使用默认值追加的更多讨论,请参阅 http://bugs.python.org/issue16399。