我在命令行解析和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')
我显然错过了一些东西,而我只是在测试我认为最简单的东西(全局参数);甚至还没有想到如何处理可选的子参数。
答案 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")