首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Argparse -不同的所需参数依赖于所提供的标志

Argparse -不同的所需参数依赖于所提供的标志
EN

Stack Overflow用户
提问于 2018-02-27 18:23:41
回答 1查看 97关注 0票数 0

我用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时,我尝试对所有选项和命令使用a解析,因为我非常喜欢它输出干净的用法和帮助信息的能力,但是原始工具的第二个功能使这一点变得更加困难。

如果我设置的'-p‘标志工作得很好,但是它仍然重新调整最后两个不需要的参数,或者用“太少的参数”失败,则使用are解析。

我认为可能子解析器是最好的选择,但是子解析器似乎不适合使用旗标样式的名称(我想我在某个地方读到它会把它剥掉?)。另一个问题是,如果我为'-p‘创建子解析器,即使使用正确的名称(例如portcheck),它也只能在为其他任务创建子解析器(称为main- task )时才能工作,它将不接受主解析器的基参数和子解析器的单独参数。所以我会被迫使用以下命令

代码语言:javascript
复制
$ prog.py  main-task  hostname  range  service  action
$ prog.py  portcheck  port_num  hostname  range

是否有一种方法可以使用可选的'-p‘标志并触发它而不需要其他两个参数?我能想到的最好的解决方案是检查-p标志,如果将这两个变量设置为空字符串,是否可以在if语句中调整这些arg值?首先,我可以将这两个参数设置为默认值为空,但如果它们没有为基本函数提供所有参数,则不能进行错误检查,从而破坏了all解析的目的。我最初开始使用sys.argv,但是我认为as解析会更像琵琶,作为初学者,这是一个很好的尝试。也许sys.argv是最好的选择?

我目前拥有的have解析代码:

代码语言:javascript
复制
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()

抱歉这篇冗长的文章

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-27 18:35:11

您可以将最后两个参数的nargs设置为'?' (0或1),如果-p不存在,则手动检查它们是否都存在:

代码语言:javascript
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49015476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档