Argparse - 提供标记的不同必需参数

时间:2018-02-27 18:23:41

标签: python argparse

我在bash中编写了一个工具,我试图将其转换为python,以便将我的技能扩展到初学者之外,但由于我最初格式化命令的方式,我遇到了麻烦。

该工具在群集中通常名为HOSTNAME01-08的一堆服务器上重新启动服务,因此原始工具将采用主机名,群集范围,服务和操作:

CompanyId change stand_alone 0 A -16.67 10 1 A 100.00 12 2 A 0.00 -5 3 B 1900.00 20 4 B 0.00 1

它还有第二个只进行端口检查的功能

$ prog.sh hostname cluster_range httpd status (ex. of range would be 01-04)

第二个命令不需要服务和操作的参数。这就是我遇到问题的地方。

在将其转换为python时,我正在尝试将argparse用于所有选项和命令,因为我非常喜欢它能够输出干净的用法和帮助信息,但原始工具的第二个功能是让它变得更难。

使用argparse,如果我设置'-p'标志可以正常工作,但它仍然需要最后两个不需要的参数,或者它失败并且“参数太少”

我想也许subparsers可能会走的路,但是subparsers似乎不适用于旗帜样式的名字(想想我读到它剥离它的某个地方?)。另一个问题是,如果我为'-p'创建subparser,即使使用正确的名称(比如portcheck),它也只能在我为其他任务创建一个subparser时使用(称之为main-task),它不会接受主解析器的基本参数和仅仅子解析器的单独参数。所以我将被迫使用像

这样的命令
$ prog.sh -p port_number hostname cluster_range

有没有办法使用可选的'-p'标志并触发它不需要其他两个参数?我能想到的最好的解决方案是检查-p标志,如果为true,将这两个变量设置为空字符串,是否可以在if语句中调整这些arg值?我可以将这两个参数设置为默认为空,但是我不能错误检查它们是否没有提供基本函数的所有参数来破坏argparse的目的。我最初开始使用sys.argv,但我认为argparse会更加pythonic,并且作为初学者尝试的好教训。也许sys.argv可能是最好的方式吗?

我目前拥有的argparse代码:

$ prog.py  main-task  hostname  range  service  action
$ prog.py  portcheck  port_num  hostname  range

对于罗嗦的帖子感到抱歉

1 个答案:

答案 0 :(得分:0)

您可以将最后两个参数的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")