2011-03-01 40 views
12

我想使用argparse解析形式的命令行「ARG = VAL」 例如參數,用法是:使用argparse解析的形式「ARG = VAL」

script.py conf_dir=/tmp/good_conf 

爲了實現它,我這樣做:

desc = "details" 
parser = argparse.ArgumentParser(description=desc, add_help=False) 
args = parser.add_argument("conf_dir") 
args = parser.parse_args("conf_dir=FOO".split()) 
args = parser.parse_args() 
print args.conf_dir 

但是,問題是,在與腳本的調用:

python script.py conf_dir=/tmp/good_conf 

我得到:

conf_dir=/tmp/good_conf 

如果如我所料

/tmp/good_conf 

所以,問題是:我可以使用argparse解析CMD線,其中包含名稱值對? 任何提示?

編輯:我想這樣做的原因而不是像--conf_dir =/tmp/good_dir這樣的東西是因爲還有其他工具(用其他語言編寫),它使用了conf_dir =/tmp/good_dir類型的參數。爲了保持一致性,我以這種方式解析參數。

+2

我沒有'argparse'可用來檢查這一點,但不應該' 「conf_dir = FOO」 .split()'實際上是'「conf_dir = FOO 」 .split( '=')'? – lafras 2011-03-01 13:11:05

回答

4

the documentation,​​本身並不讓你有這樣的前綴的選項。如果省略了領先-,它假定你所描述的位置參數,並預計它要提供:

python script.py /tmp/good_conf 

如果你希望它是可選的,它需要通過調用它被正確標記作爲一個標誌--conf_dir,並調用腳本,如:

python script.py --conf_dir=/tmp/good_conf 

然而,接受名稱 - 值對,您可以實現custom action。結合nargs,此類操作可以接受任意數量的名稱 - 值對並將它們存儲在參數解析結果對象中。

19

你需要一個自定義操作

class StoreNameValuePair(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     n, v = values.split('=') 
     setattr(namespace, n, v) 

args = parser.add_argument("conf_dir", action=StoreNameValuePair)