使用REMAINDER时argparse

时间:2017-08-10 12:50:09

标签: python

我创建了以下参数解析器:

parser = argparse.ArgumentParser()
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('--src', nargs='?')

运行./script.py the_name the_script --src my_script.py时,所有参数都会“按预期”获得其值。

现在,我添加一个余数:

parser = argparse.ArgumentParser()
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('--src', nargs='?')
parser.add_argument('args', nargs=argparse.REMAINDER)

现在,再次运行./script.py the_name the_script --src my_script.py,参数src突然变为None

但是,运行./script.py --src my_script.py the_name the_script --arg1 arg2 xyz会将所有参数设置为“按预期”。

我怎样才能实现我的参数解析器首先要查看位置参数namescript,然后是一些已知的参数,如--src,最后是一个任意的余数?

2 个答案:

答案 0 :(得分:0)

args

但是你必须始终提供至少一个print parser.parse_args('--src 12 1 2 3 4'.split()) print parser.parse_args('1 2 --src 12 3 4'.split()) 参数。

Namespace(args=['3', '4'], name='1', script='2', src='12')
Namespace(args=['3', '4'], name='1', script='2', src='12')

输出:

nargs='*'

不能与parser.add_argument('args', nargs='*') print parser.parse_args('--src 12 1 2 3 4'.split()) print parser.parse_args('1 2 --src 12 3 4'.split()) 合作,唉:

Namespace(args=['3', '4'], name='1', script='2', src='12')
usage: argp.py [-h] [--src SRC] name script [args [args ...]]
argp.py: error: unrecognized arguments: 3 4

输出:

--src 12 1 2 3 4

即。 1 2 --src 12 3 4有效但public StudentArrayUtilities() { numStudents = 0; theArray = new Student[MAX_STUDENTS]; } 没有。

答案 1 :(得分:0)

您的问题看起来与section "15.4.3.3. nargs" in Python's official docs末尾使用的示例非常相似。

似乎问题的答案是将--src作为第一个参数,在位置之前。

我做了以下操作,似乎有效:

parser = argparse.ArgumentParser()
parser.add_argument('--src')
parser.add_argument('name')
parser.add_argument('script')
parser.add_argument('args', nargs=argparse.REMAINDER)

当我像使用./script.py --src=my_script.py the_name the_script 1 2 3一样运行上述脚本时,结果如预期那样:

name = the_name
script = the_script
src = my_script.py
args = ['1', '2', '3']

如果删除像./script.py the_name the_script 1 2 3这样的--src,则结果为:

name = the_name
script = the_script
src = None
args = ['1', '2', '3']`

当然,我可以保留--src并省略1 2 3个参数,因此如果我运行./script.py --src=my_script.py the_name the_script,结果是:

name = the_name
script = the_script
src = my_script.py
args = []`

这看起来像你期望的那样。