使用argparse只接受一组必需参数

时间:2017-01-17 13:51:52

标签: argparse

我正在尝试将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,他将不得不提供所有这些。

我也希望至少有一组能够满足。

2 个答案:

答案 0 :(得分:0)

互斥组不是为嵌套而设计的。它接受你的代码,但净效果使4个参数独占。它只接受pathopt1opt2等中的一个。

虽然我已经探索过定义嵌套组,并允许在组内进行anyand操作,但这样的功能还有很长的路要走。

由于您的用户必须提供全部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

帮助将告诉您所需的位置参数,其值可以为fileopts

% 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