如何解析与选项混合的几个位置参数?

时间:2017-10-12 06:14:21

标签: python argparse


我需要像这样解析命令行字符串:

ms-excel:ofv|u|file://(Your IP Address or any address)/somefolder/document.xlsx

即。选项(带连字符)和位置参数(启动时没有它) 可由用户混合:(

我尝试指定几个位置参数,但这不起作用:

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()))

出错了什么? 谢谢!

P.S。很抱歉,如果问题是愚蠢的,我是Python的新手,并使用这些库解析参数。
P.P.S.参数"节点frontend.js"被忽略

1 个答案:

答案 0 :(得分:1)

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'])

早期的解析器(如optparsegetopt)只处理标记的参数,并将其余的作为列表返回。你必须自己解析这些。