我写我的一个项目,该项目由设计解析命令看起来像这样一个shell:定制命令行Python中
COMMAND_NAME ARG1 =“long值” ARG2 = 123 = ARG3我@我我的问题是,Python的命令行解析库(getopt和optparse)迫使我在参数前面使用' - '或' - '。这种行为与我的要求不符。
任何想法如何解决?任何现有的图书馆?
我写我的一个项目,该项目由设计解析命令看起来像这样一个shell:定制命令行Python中
COMMAND_NAME ARG1 =“long值” ARG2 = 123 = ARG3我@我我的问题是,Python的命令行解析库(getopt和optparse)迫使我在参数前面使用' - '或' - '。这种行为与我的要求不符。
任何想法如何解决?任何现有的图书馆?
你可以用shlex.split()他们分手了,它可以处理你所引用的值,并很容易地用一个非常简单的正则表达式来解析它。或者,您可以使用正则表达式进行拆分和解析。或者简单地使用split()。
args = {}
for arg in shlex.split(cmdln_args):
key, value = arg.split('=', 1)
args[key] = value
在Python 2.5及以上版本中,您还可以这样做:key,_,value = arg.partition('=') – tzot 2008-10-01 12:57:27
如果没有在optparse或getopt上进行相当密集的手术,我不相信你能够明智地让他们解析你的格式。您可以轻松地分析自己的格式,不过,还是把它翻译成什么optparse可以处理:
parser = optparse.OptionParser()
parser.add_option("--ARG1", dest="arg1", help="....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
parts = arg.split('=', 1)
if len(parts) < 2:
# End of options, don't translate the rest.
newargs.extend(sys.argv[idx+1:])
break
argname, argvalue = parts
newargs.extend(["--%s" % argname, argvalue])
parser.parse_args(newargs)
上Ironforggy的shlex回答一个小Python的变化:
args = dict(arg.split('=', 1) for arg in shlex.split(cmdln_args))
哎呀... - 纠正。
谢谢,J.F.塞巴斯蒂安 (记得那些单参数生成器表达式)。
将您的参数(如托马斯建议),以OptionParser格式。
parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
如果命令行参数不在sys.argv中或类似的列表,但在一个字符串然后(如ironfroggy建议的)使用shlex.split()
。
parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
怎么样optmatch(http://www.coderazzi.net/python/optmatch/index.htm)?是不是标准,而是采用不同的方法来选择解析,它支持任何前缀:
OptionMatcher.setMode(optionPrefix =“ - ”)
您可能会感兴趣的Python模块中,我写做的命令行参数更容易(开源和免费使用)处理 - http://freshmeat.net/projects/commando
,在“龙价值”空白可能会给你额外的麻烦。我不确定optparse(或其他库)是否可以处理此问题。 – Ralph 2008-10-01 10:09:20
@Ralph:optparse处理“Long Value”就好了。 – jfs 2008-10-01 13:12:41