[英]Argparse - different required parameters depnding on flag provided
我用bash编写了一个工具,为了将我的技能扩展到初学者之外,我试图将其转换为python,但是由于我最初格式化命令的方式而遇到了麻烦。
该工具在通常称为HOSTNAME01-08的群集中的一堆服务器上重新启动服务,因此原始工具采用主机名,群集范围,服务和操作:
$ prog.sh hostname cluster_range httpd status (ex. of range would be 01-04)
它还具有第二个功能,该功能将仅执行端口检查
$ prog.sh -p port_number hostname cluster_range
第二个命令不需要服务和操作的论据。 这是我要解决的问题。
在将其转换为python时,我尝试将argparse用于所有选项和命令,因为我真的很喜欢它能够输出干净的用法和帮助信息的功能,但是原始工具的第二个功能使此操作变得更加困难。
如果我将argparse设置为可以正常运行的'-p'标志,则使用argparse,但是它仍然需要最后两个不需要的参数,否则会因“参数太少”而失败
我以为可能会使用次级解析器,但是次级解析器似乎无法使用标志样式名称(想想我读过的地方会剥离它吗?)。 另一个问题是,即使我使用正确的名称为“ -p”创建了子解析器(例如,portcheck),它也只能在我为其他任务(也称为主任务)创建子解析器的情况下起作用,它不会接受具有主解析器的基本参数和子解析器的单独参数。 所以我将被迫使用类似的命令
$ prog.py main-task hostname range service action
$ prog.py portcheck port_num hostname range
有没有办法使用可选的'-p'标志并触发它不需要其他两个参数? 我能想到的最佳解决方案是检查-p标志,如果将这两个变量设置为空字符串为true,是否可以在if语句中调整这些arg值? 我可以将这两个参数默认设置为空,但是我不能错误检查它们是否没有提供基本参数的所有参数,从而破坏了argparse的目的。 我最初开始使用sys.argv,但当时认为argparse会更具有Python风格,并且是一个适合初学者的好课程。 也许sys.argv可能是最好的选择?
我目前拥有的argparse代码:
parser = argparse.ArgumentParser(
usage=None,
formatter_class=argparse.RawDescriptionHelpFormatter,
description=textwrap.dedent('''\
Usage:
drtt BASE-HOSTNAME CLS-RANGE SERVICE ACTION
ex. drtt HOSTNAME 01-08 sshd status
For port check only:
drtt [-p, --port-number] PORT-NUMBER BASE-HOSTNAME CLS-RANGE
ex. drtt -p 1234 HOSTNAME 01-08'''))
parser.add_argument('base_hostname', help='Host name only')
parser.add_argument('--port-number', '-p', type=int, metavar='PORT-NUMBER', help="Port number to check if listening")
parser.add_argument('cls_range', help='Number of hosts in cluster (written as start-finish ex. 01-16)')
parser.add_argument('service', help='Service/Process to perform an action on')
parser.add_argument('action', help='start, stop status or restart')
args = parser.parse_args()
对不起罗post的帖子
您可以将最后两个参数的nargs
设置为'?'
(0或1),并手动检查它们是否同时存在(如果-p
不存在):
if args.port_number is None and (args.service is None or args.action is None):
parser.print_help()
parser.error("Missing mandatory arguments sevice and action")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.