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中的自定义命令行解析的主要内容,如果未能解决你的问题,请参考以下文章

magnolia 中的自定义命令定义

如何使用 ant 命令行来选择我的自定义 build.xml

在命令行上使用带有jupyter nbconvert v5.3.1的自定义预处理器

windows 命令提示符中的自定义命令

python内置库--argparse

使用 PATH 变量中的子进程执行自定义命令