print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++'.split()))
产生
Namespace(foo='B', other_options=['project_2.pro'], project_files=['project_1.pro'], spec=['linux-g++'])
'progject_2.pro' 被分配给other_options
而不是project_files
。这是因为如何处理2 nargs='+'
。
parse_args
候补处理定位和可选项(标记)。它试图处理尽可能多的定位。这可能会导致意想不到的结果,当其中一个或多个具有这些'开放式'nargs
像+
和*
。
我建议改为:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo')
parser.add_argument('project_files', nargs='+')
parser.add_argument('--spec')
parser.add_argument('--other', nargs='+')
print(parser.parse_args('--foo B project_1.pro project_2.pro --spec linux-g++'.split()))
print(parser.parse_args('--foo B project_1.pro project_2.pro --spec linux-g++ --other CONFIG+=debug CONFIG+=qml_debug'.split()))
导致
2343:~/mypy$ python stack46702635.py
Namespace(foo='B', other=None, project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++')
Namespace(foo='B', other=['CONFIG+=debug', 'CONFIG+=qml_debug'], project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++')
https://bugs.python.org/issue15112 - argparse: nargs='*' positional argument doesn't accept any items if preceded by an option and another positional
https://bugs.python.org/issue9338 - argparse optionals with nargs='?', '*' or '+' can't be followed by positionals
您可以省略other
参数,并使用parse_known_args
。未知字符串将在单独的列表中返回。
#parser.add_argument('other', nargs='...')
print(parser.parse_known_args('--foo B project_1.pro project_2.pro --spec linux-g++'.split()))
print(parser.parse_known_args('--foo B project_1.pro project_2.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split()))
0859:~/mypy$ python stack46702635.py
(Namespace(foo='B', project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++'), [])
(Namespace(foo='B', project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++'), ['CONFIG+=debug', 'CONFIG+=qml_debug'])
像optparse
和getopt
早些时候解析器只是处理的标记参数,并返回剩下的列表。你必须自己解析这些。
因此,可以有两组或更多组位置参数,用“常规”选项分隔 - 或者argparse不能这样做? – eraxillan
UPD:一个问题是我应该支持其他应用程序(Qt qmake)的命令行格式,所以我不能更改选项格式:( – eraxillan
“-spec”定义在两个位置之间并不重要。解析是由命令行中的顺序决定的。有几个关于改进这种处理的错误/问题,但没有做出正式的修改。 – hpaulj