我已阅读了不少教程,问题和文档,但无法弄清楚如何实现这一目标:
prog.py [-h] [-d DEVICE -l | (-m M -s S -p P)]
使用-l参数时,prog.py从设备接口读取。当提供-m,-s和/或-p时,prog.py会写入该接口。同时不可能进行读写,因此读写参数是相互排斥的。
一旦指定了DEVICE,就需要提供-l或-m,-s或-p中的至少一个,也应该可以提供这三者的任意组合。
到目前为止,我从各个角度解决了这个问题:
这是我上次尝试的内容:
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument("-d","--device",
default="system",
help="foo")
subparsers = parser.add_subparsers(help='foo')
read_parser = subparsers.add_parser('read', help='foo')
read_parser.add_argument("-l", "--list",
action="store_true")
write_parser = subparsers.add_parser("write", help="bar")
write_parser.add_argument("-m","--mode",
type=str,
choices=["on","off","auto"],
help="foo")
write_parser.add_argument("-s", "--season",
type=str,
choices=["winter","summer"],
help="foo")
write_parser.add_argument("-p","--present",
type=int,
choices=[0,1],
help="foo")
parser.parse_args()
这甚至不像subparsers argparse期望读或写。我需要做的是添加互斥的组。任何人都知道如何解决这个问题?
答案 0 :(得分:0)
如果传递了正确的参数组合,您可以自行检查(使用基本的argparse功能):
parser = argparse.ArgumentParser()
parser.add_argument("-d","--device",
default="system",
help="foo")
parser.add_argument("-l", "--list",
action="store_true")
parser.add_argument("-m","--mode",
type=str,
choices=["on","off","auto"],
help="foo")
parser.add_argument("-s", "--season",
type=str,
choices=["winter","summer"],
help="foo")
parser.add_argument("-p","--present",
type=int,
choices=[0,1],
help="foo")
args = parser.parse_args()
# if user defines device but not any read/write argument raise exception
if args.device is not None and not args.list and all(arg is None for arg in (args.season, args.present, args.mode)):
parser.error('Wrong arguments passed')
# if user defines read and write arguments at the same time raise exception
if args.list and not all(arg is None for arg in (args.season, args.present, args.mode)):
parser.error('Wrong arguments passed')