Python 通过 argparse 多次使用不同的选项

2024-02-06

我正在开发一个自定义 Nagios 脚本,我想在其中以与现有 Nagios 插件相同的方式实现命令行参数的解析check_disk.

在该插件中你有一个选项参数-C to Clear当前配置并使用新参数重新开始。

摘自check_disk help:

check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar
           ----(3)-----    ---------(1)----------    --------(2)--------

Checks 警告/严重阈值:

  1. 对于体积/foo使用1000M和500M作为阈值
  2. 对于体积/bar使用5%和3%
  3. 所有剩余卷使用 100M 和 50M

我尝试过argparse和一些参数作为action='append'但重复的参数存储在列表中,丢失的参数不作为“无”条目包含在内。

我也尝试过parse_known_args希望首先停止解析unknown参数,但我得到一个包含所有已知参数和未知参数列表的名称空间。

我想我唯一的选择是在解析命令行参数之前使用正则表达式。

import re
import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('-w', help='warning')
parser.add_argument('-c', help='critical')
parser.add_argument('-p', help='path')

separator=r'-S'
groups = re.split(separator, '|'.join(sys.argv[1:])))

args = []
for idx, group_args in enumerate(groups):
   args.append('')
   args[idx]=parser.parse_args(group_args.split('|'))

我不知道如果argparse可以处理这种场景,无需使用正则表达式进行分割。

或者如果这是我能找到的最好方法。

这与以下无关在 Python 的 argparse 中多次使用相同的选项 https://stackoverflow.com/questions/36166225/using-the-same-option-multiple-times-in-pythons-argparse因为情况不同,所以我有不同的可选参数,而不仅仅是一个具有多个值的选项。

在上面的例子中(3)没有选项-p,(1)和(2)有它。这是差异之一,也是问题之一。如果所有选项都是强制性的,那就很容易了。


要处理这个问题:

check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar

我可以想象从命名空间开始

args = argparse.Namespace(w:[None], c:[None], p:[None])
args = parser.parse_args(args=args)

并定义几个自定义操作类。

For `-C` use a class that appends a `None` to each of those 3 attributes
    namespace['w'].append(None), etc

For each of `w`, `c` and `p`, an Action class, that replaces the last `None`
    with the users value.  

换句话说,使用C通过推进列表将参数设置为“重置”,然后使用其他参数来调整默认值。

或者从Namespace(C=[[None, None, None]]),并添加一个带有每个“C”的附加列表。然后 'w' 将设置namespace['C'][-1][0]等等(或使用字典列表)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 通过 argparse 多次使用不同的选项 的相关文章

随机推荐