2008-10-01 58 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

享受。