如何在argparse中使用互斥参数?
这是一个关于如何从命令行读取一些数据(比如电子邮件地址)的必读列表:
some_util -l email1@x.com email2@x.com
或者你也可以从一个文件中读取:
some_util -L email.lst
接下来是如何让程序不允许同时使用两个选项 -l 和 -L 的方法,这个是在 argparse 里实现的。
import argparse
import sys
def createCLParser():
parser = argparse.ArgumentParser()
parser.add_argument('-l', '--list', nargs='+', help='list from comand line')
parser.add_argument('-L', '--list-file', type=argparse.FileType(), help='list from file')
return parser
if __name__ == '__main__':
parser = createCLParser()
namespace = parser.parse_args(sys.argv[1:])
在 argparse 中,有一个方法叫 add_mutually_exclusive_group (),但是这个方法是可选的。
2 个回答
0
因为其中一个是必须的,所以这种情况更适合使用子命令:
some_util fromList email1@x.com email2@x.com
或者
some_util fromFile email.lst
代码看起来会像这样:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
addr_parser = subparsers.add_parser("fromList")
file_parser = subparsers.add_parser("fromFile")
addr_parser.add_argument("addresses", nargs="+")
addr_parser.setdefaults(command="fromList")
file_parser.add_argument("address_file")
file_parser.setdefaults(command="fromFile")
parser.set_defaults(
args = parser.parse_args()
if args.command == "fromList":
# use args.addresses
elif args.command == "fromFile":
# read addresses from file named by args.address_file
1
使用 .add_mutually_exclusive_group()
方法,并设置 required=True
:
import argparse
import sys
def createCLParser():
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-l', '--list', nargs='+', help='list from comand line')
group.add_argument('-L', '--list-file', type=argparse.FileType(), help='list from file')
return parser
if __name__ == '__main__':
parser = createCLParser()
namespace = parser.parse_args(sys.argv[1:])
print namespace
用法:
$ python ar.py
usage: ar.py [-h] (-l LIST [LIST ...] | -L LIST_FILE)
ar.py: error: one of the arguments -l/--list -L/--list-file is required
$ python ar.py -l foo@example.com
Namespace(list=['foo@example.com'], list_file=None)
$ python ar.py -l foo@example.com -L bar
usage: ar.py [-h] (-l LIST [LIST ...] | -L LIST_FILE)
ar.py: error: argument -L/--list-file: not allowed with argument -l/--list