将强制性和可选args与子命令结合在一起

时间:2018-12-27 15:30:32

标签: python-3.x argparse

我在命令行解析和argparse方面苦苦挣扎,如何处理全局变量,子命令以及这些子命令的可选参数

我正在围绕python-libvirt写一个python3包装器来管理我的VM。包装器将处理创建,删除,停止/启动,快照等。

部分选项列表如下,显示了将参数传递给脚本的不同方式:

# Connection option for all commands:
# ---
# vmman.py [-c hypervisor] (defaults to qemu:///system)

# Generic VM commands:
# ---
# vmman.py show : list all vms, with their state
# vmman.py {up|down|reboot|rm} domain : boots, shuts down, reboots 
or deletes the domain

# Snapshot management:
# ---
# vmman.py lssnap domain : list snapshots attached to domain
# vmman.py snaprev domain [snapsname] : reverts domain to latest 
snapshot or to snapname

# Resource management:
# ---
# vmman.py domain resdel [disk name] [net iface]

然后是一些用于测试第一个子命令的代码:

def setConnectionString(args):
    print('Arg = %s' % args.cstring)

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

parserConnect = subparsers.add_parser('ConnectionURI')
parserConnect.set_defaults(func=setConnectionString)
parserConnect.add_argument('-c', '--connect', dest='host')

args = parser.parse_args()
args.func(args)
print("COMPLETED")

现在,docs.python.org上的argparse()文档非常密集,并且像我一样,这使python新手有点困惑...我希望输出是这样的:

`Arg = oslo`

我得到的是:

[10:21:40|jfgratton@bergen:kvmman.py]: ./argstest.py -c oslo
usage: argstest.py [-h] {ConnectionURI} ...
argstest.py: error: invalid choice: 'connectionURI' (choose from 'ConnectionURI')

我显然错过了一些东西,而我只是在测试我认为最简单的东西(全局参数);甚至还没有想到如何处理可选的子参数。

1 个答案:

答案 0 :(得分:0)

您的错误输出列出了带有小写字母'c'的'connectionURI'作为无效选择,同时还显示了“从'ConnectionURI'中选择”并带有大写字母'C'。

修复:致电:

./ argstest.py ConnectionURI奥斯陆

也许您应该从简单开始(没有子解析器)并从那里开始构建:

import argparse

def setConnectionString(hostname):
    print('Arg = {}'.format(hostname))

parser = argparse.ArgumentParser(description='python3 wrapper around python-libvirt to manage VMs')
parser.add_argument('hostname')

args = parser.parse_args()
setConnectionString(args.hostname)

print("COMPLETED")