2008-10-01 60 views
7
解析

我写我的一个项目,该项目由设计解析命令看起来像这样一个shell:定制命令行Python中

COMMAND_NAME ARG1 =“long值” ARG2 = 123 = ARG3我@我我的问题是,Python的命令行解析库(getopt和optparse)迫使我在参数前面使用' - '或' - '。这种行为与我的要求不符。

任何想法如何解决?任何现有的图书馆?

+0

,在“龙价值”空白可能会给你额外的麻烦。我不确定optparse(或其他库)是否可以处理此问题。 – Ralph 2008-10-01 10:09:20

+1

@Ralph:optparse处理“Long Value”就好了。 – jfs 2008-10-01 13:12:41

回答

10

你可以用shlex.split()他们分手了,它可以处理你所引用的值,并很容易地用一个非常简单的正则表达式来解析它。或者,您可以使用正则表达式进行拆分和解析。或者简单地使用split()。

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

在Python 2.5及以上版本中,您还可以这样做:key,_,value = arg.partition('=') – tzot 2008-10-01 12:57:27

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) 
2

上Ironforggy的shlex回答一个小Python的变化:

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

哎呀... - 纠正。

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

9
  1. 尝试按照 “Standards for Command Line Interfaces

  2. 将您的参数(如托马斯建议),以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)]) 
0

小迟到了......但PEP 389允许这种以及更多。

这里有一个小图书馆不错您应该Python版本需要code.google.com/p/argparse

享受。