如何解析多个与选项混合的位置参数?
How to parse several positional arguments mixed with options?
我需要像这样解析命令行字符串:
node frontend.js project1.pro project2.pro ... projectN.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -opt1 value1 ... -opt2 value2
即选项(带连字符)和位置参数(开头没有)
可以由用户混合:(
我尝试指定几个位置参数,但这不起作用:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo')
parser.add_argument('project_files', default=[], nargs='+')
parser.add_argument('-spec', nargs=1, required=True)
parser.add_argument('other_options', default=[], nargs='+')
print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split()))
但是出现这样的错误:
PROG: error: unrecognized arguments: CONFIG+=debug CONFIG+=qml_debug
哪里做错了?
谢谢!
P.S。抱歉,如果问题很愚蠢,我是 Python 的新手,并且使用此类库进行参数解析。
P.P.S。参数 "node frontend.js" 被忽略
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
交替处理位置变量和可选变量(已标记)。它会尝试处理尽可能多的位置。当其中一个或多个具有 'open-ended' 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
只处理标记的参数,并将其余部分作为列表返回。你必须自己解析这些。
我需要像这样解析命令行字符串:
node frontend.js project1.pro project2.pro ... projectN.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -opt1 value1 ... -opt2 value2
即选项(带连字符)和位置参数(开头没有) 可以由用户混合:(
我尝试指定几个位置参数,但这不起作用:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo')
parser.add_argument('project_files', default=[], nargs='+')
parser.add_argument('-spec', nargs=1, required=True)
parser.add_argument('other_options', default=[], nargs='+')
print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split()))
但是出现这样的错误:
PROG: error: unrecognized arguments: CONFIG+=debug CONFIG+=qml_debug
哪里做错了? 谢谢!
P.S。抱歉,如果问题很愚蠢,我是 Python 的新手,并且使用此类库进行参数解析。
P.P.S。参数 "node frontend.js" 被忽略
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
交替处理位置变量和可选变量(已标记)。它会尝试处理尽可能多的位置。当其中一个或多个具有 'open-ended' 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
只处理标记的参数,并将其余部分作为列表返回。你必须自己解析这些。