Python中的自定义命令行解析

时间:2008-10-01 09:35:36

标签: python parsing shell command-line arguments

我正在为我的一个项目编写一个shell,它通过设计解析看起来像这样的命令:

COMMAND_NAME ARG1 =“长值”ARG2 = 123 ARG3=me@me.com

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

任何想法如何解决这个问题?任何现有的库?

7 个答案:

答案 0 :(得分:10)

您可以使用shlex.split()将它们拆分,它可以处理您拥有的引用值,并且可以使用非常简单的正则表达式轻松解析它。或者,您可以使用正则表达式进行拆分和解析。或者只使用split()。

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

答案 1 :(得分:9)

  1. 尝试关注“Standards for Command Line Interfaces

  2. 将您的参数(如Thomas建议的)转换为OptionParser格式。

    parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
    
  3. 如果命令行参数不在sys.argv或类似的列表中但在字符串中,那么(如铁蛙建议的那样)使用shlex.split()

    parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
    

答案 2 :(得分:2)

Ironforggy的回应中的一个小的pythonic变体:

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

哎呀...... - 纠正了。

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

答案 3 :(得分:1)

optmatch(http://www.coderazzi.net/python/optmatch/index.htm)怎么样?不是标准的,但采用不同的方法进行选项解析,并且它支持任何前缀:

OptionMatcher.setMode(optionPrefix = ' - ')

答案 4 :(得分:0)

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

答案 5 :(得分:0)

晚会很晚......但是PEP 389允许这个以及更多。

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

享受。

答案 6 :(得分:0)

您可能对我编写的一些Python模块感兴趣,以便更轻松地处理命令行参数(开源和免费使用) - http://freshmeat.net/projects/commando