Python中的自定义命令行解析
Posted
技术标签:
【中文标题】Python中的自定义命令行解析【英文标题】:Customized command line parsing in Python 【发布时间】:2010-09-14 11:41:00 【问题描述】:我正在为我的一个项目编写一个 shell,它通过设计解析如下所示的命令:
COMMAND_NAME ARG1="长值" ARG2=123 ARG3=me@me.com
我的问题是 Python 的命令行解析库(getopt 和 optparse)迫使我在参数前使用“-”或“--”。这种行为不符合我的要求。
任何想法如何解决?任何现有的图书馆?
【问题讨论】:
“长值”中的空白可能会给您带来额外的麻烦。我不确定 optparse(或其他库)可以处理这个问题。 @Ralph:optparse 处理“长值”就好了。 【参考方案1】:您可以使用 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('=') args = dict(arg.split('=', 1) for arg in shlex.split(cmdln_args))【参考方案2】:尝试关注“Standards for Command Line Interfaces”
将您的参数(如 Thomas 建议的那样)转换为 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)])
【讨论】:
【参考方案3】:Ironforggy 的 shlex 答案的一个小的 Python 变体:
args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )
糟糕... - 已更正。
谢谢,J.F. 塞巴斯蒂安 (必须记住那些单参数生成器表达式)。
【讨论】:
【参考方案4】:optmatch (http://www.coderazzi.net/python/optmatch/index.htm) 怎么样?不是标准的,但对选项解析采取了不同的方法,它支持任何前缀:
OptionMatcher.setMode(optionPrefix='-')
【讨论】:
@rafalotufo,我认为您对这个问题的提议编辑应该是一个评论——指出提议的解决方案将无法正常工作,这极大地改变了答案的含义。 :)【参考方案5】:如果不对 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)
【讨论】:
【参考方案6】:晚会有点晚了...但PEP 389 允许这样做以及更多。
如果您的 Python 版本需要,这里有一个不错的库 code.google.com/p/argparse
享受吧。
【讨论】:
【参考方案7】:您可能对我编写的一个 Python 小模块感兴趣,它可以让命令行参数的处理更加轻松(开源且免费使用)-http://freshmeat.net/projects/commando
【讨论】:
以上是关于Python中的自定义命令行解析的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ant 命令行来选择我的自定义 build.xml