我创建了以下参数解析器:
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
会将所有参数设置为“按预期”。
我怎样才能实现我的参数解析器首先要查看位置参数name
和script
,然后是一些已知的参数,如--src
,最后是一个任意的余数?
答案 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 = []`
这看起来像你期望的那样。