我正在尝试将parser = argparse.ArgumentParser
用于我编写的lil程序。
该程序接受EITHER
(
输入作为txt文件的路径)
OR
(
opt1 &&
opt2 {{1 } opt3 &&
。
意思是如果用户想要使用txt文件作为输入,他不能提供)
,如果他提供任何opt
- 他必须提供所有3并且不能提供{{1} }。
我尝试使用opt
但不确定如何使用,因为第二组参数本身就是一个组。
这是我到目前为止所尝试的:
a path to a txt file
-
add_mutually_exclusive_group
任何import argparse
parser = argparse.ArgumentParser(description='this is the description',)
root_group = parser.add_mutually_exclusive_group()
group_list = root_group.add_mutually_exclusive_group()
group_list.add_argument('-path', help='path to the txt file')
group_list = root_group.add_mutually_exclusive_group()
group_list.add_argument('-opt1', help='opt1')
group_list.add_argument('-opt2', help='opt2')
group_list.add_argument('-opt3', help='opt3')
args = parser.parse_args()
都不允许 python tests.py -path txt -opt1 asdasd
usage: tests.py [-h] [[-path PATH] [-opt1 OPT1 | -opt2 OPT2 | -opt3 OPT3]
tests.py: error: argument -opt1: not allowed with argument -path
- 这正是我想要的。
但我希望如果用户提供了1 path
,他将不得不提供所有这些。
我也希望至少有一组能够满足。
答案 0 :(得分:0)
互斥组不是为嵌套而设计的。它接受你的代码,但净效果使4个参数独占。它只接受path
,opt1
,opt2
等中的一个。
虽然我已经探索过定义嵌套组,并允许在组内进行any
或and
操作,但这样的功能还有很长的路要走。
由于您的用户必须提供全部3 --opt
,我建议将其缩写成一个参数:
root_group.add_argument('--opt', nargs=3)
root_group.add_argument('--path')
用法应该类似于
usage: tests.py [-h] [--path PATH | --opt OPT OPT OPT]
与允许nested inclusive groups
的假设用法形成对比:
[-path PATH | [-opt1 OPT1 & -opt2 OPT2 & -opt3 OPT3]]
===========
使用元组元变量,可以将用法细化为:
g.add_argument('--opt',nargs=3,metavar=('OPT1','OPT2','OPT3'))
usage: ipython3 [-h] [--path PATH | --opt OPT1 OPT2 OPT3]
=============
您的另一个选择是编写自定义usage
并在解析后执行您自己的逻辑测试。
答案 1 :(得分:0)
我会改用子命令解析器。您的“选项”并不是真正的可选项;它们是特定上下文中的3个必需参数。
import argparse
p = argparse.ArgumentParser()
sp = p.add_subparsers()
p1 = sp.add_parser('file')
p1.add_argument('path')
p2 = sp.add_parser('opts')
p2.add_argument('opt1')
p2.add_argument('opt2')
p2.add_argument('opt3')
args = parser.parse_args()
然后您将使用
来调用脚本python tmp.py file foo.txt
或
python tmp.py opts 1 2 3
帮助将告诉您所需的位置参数,其值可以为file
或opts
:
% python tmp.py -h
usage: tmp.py [-h] {file,opts} ...
positional arguments:
{file,opts}
optional arguments:
-h, --help show this help message and exit
,每个子命令都有自己的用法消息:
% python tmp.py file -h
usage: tmp.py file [-h] path
positional arguments:
path
optional arguments:
-h, --help show this help message and exit
% python tmp.py opts -h
usage: tmp.py opts [-h] opt1 opt2 opt3
positional arguments:
opt1
opt2
opt3
optional arguments:
-h, --help show this help message and exit