Python中的自定义命令行解析

时间:2020-03-06 14:58:08  来源:igfitidea点击:

我正在为我的项目编写外壳程序,该外壳程序经设计可解析如下所示的命令:

COMMAND_NAME ARG1 =" Long Value" ARG2 = 123 [email protected]

我的问题是Python的命令行解析库(getopt和optparse)迫使我在参数前面使用'-'或者'-'。此行为不符合我的要求。

有什么想法可以解决吗?有任何现有的图书馆吗?

解决方案

如果不对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)

我们可以使用shlex.split()将它们拆分,该文件可以处理我们拥有的带引号的值,并可以非常简单地使用非常简单的正则表达式对其进行解析。或者,我们可以只使用正则表达式进行拆分和解析。或者只是使用split()。

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value

Ironforggy的shlex答案有一个小的pythonic变体:

args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )

糟糕...已更正。

谢谢,塞巴斯蒂安·J·F
(请记住那些单参数生成器表达式)。

  • 尝试遵循"命令行界面标准"
  • 将参数(如Thomas所建议的那样)转换为OptionParser格式。
parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])

如果命令行参数不在sys.argv或者类似列表中,而是在字符串中,则(如讽刺建议)使用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 ='-')

聚会晚了一点……但是PEP 389可以做到这一点以及更多。

如果Python版本需要它,那么这里有一个不错的库code.google.com/p/argparse

享受。