我寫我的一個項目,該項目由設計解析命令看起來像這樣一個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