【发布时间】:2020-10-12 22:04:41
【问题描述】:
我正在编写一个自定义 Nagios 脚本,我想在其中以与现有 Nagios 插件 check_disk 上使用的相同方式实现命令行参数的解析。
在该插件中,您有一个选项参数 -C 到 Clear 当前配置并使用新参数重新开始。
摘自check_disk帮助:
check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar
----(3)----- ---------(1)---------- --------(2)--------
检查警告/严重阈值:
- 对于卷
/foo,使用 1000M 和 500M 作为阈值 - 对于音量
/bar使用 5% 和 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是否可以不用正则表达式分割处理这种场景。
或者,如果这是我能找到的最佳方法。
这与Using the same option multiple times in Python's argparse 无关,因为它不是同一种情况,我有不同的可选参数,而不仅仅是一个具有多个值的选项。
在上面的例子中(3)没有选项-p,(1)和(2)有它。这是差异之一,也是问题之一。如果所有选项都是强制性的,那就很容易了。
【问题讨论】:
-
你想要的不适合
argparse解析方法,如果有的话。它按照用户提供的顺序独立处理标记选项(append处理的除外)。您可以使用nargs(例如 3 或 +)来近似您想要的结果。 -
在设计花哨的 API 时请记住,您必须向用户解释它。
argparse很简单,usage可以自动生成(甚至代码很脆弱)。 -
不幸的是,
argparse不会直接执行您想要的操作,因此您将输入参数预解析为组的想法可能是唯一的选择。我也不知道任何其他可以处理此用例的参数解析工具(我认为我已经查看了所有这些工具)。 -
@FMc 你能发表你的评论作为答案吗?