我用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 )时才能工作,它将不接受主解析器的基参数和子解析器的单独参数。所以我会被迫使用以下命令
$ 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解析代码:
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()抱歉这篇冗长的文章
发布于 2018-02-27 18:35:11
您可以将最后两个参数的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")https://stackoverflow.com/questions/49015476
复制相似问题