2015-04-28 85 views
0

下面的代碼接受mode的命令行參數,如-m fizz-m fizz bazz。如預期的那樣,這將參數傳遞給主函數['fizz', 'bazz'](對於上面的第二個示例)。用空格傳遞命令行參數似乎是用戶不友好的,所以我想讓argparse接受一個逗號分隔的列表,例如-m fizz,bazz-m ['fizz','bazz']。我如何修改下面的代碼來做到這一點?謝謝!Python argparse列表輸入

import agrparse 
... 
parser.add_argument("-m", "--mode", nargs="*", 
        default=["fizz", "bazz", "razmataz"], 
        help="Comma separated list of mode(s) to use, e.g." 
        "[\"fizz\", \"bazz\"]") 
main(parser.parse_args()) 

回答

1

用一個簡單的腳本,打印sys.argv我得到

1014:~/mypy$ python echoargv.py -m ['fizz','bazz'] 
['echoargv.py', '-m', '[fizz,bazz]'] 
1014:~/mypy$ python echoargv.py -m fizz,bazz 
['echoargv.py', '-m', 'fizz,bazz'] 
1015:~/mypy$ python echoargv.py -m fizz, bazz 
['echoargv.py', '-m', 'fizz,', 'bazz'] 
1016:~/mypy$ python echoargv.py -m ['fizz', 'bazz'] 
['echoargv.py', '-m', '[fizz,', 'bazz]'] 
1016:~/mypy$ python echoargv.py -m fizz bazz 
['echoargv.py', '-m', 'fizz', 'bazz'] 

這就是你的parser與合作。

最後一種情況,其中每個字符串都是sys.argv中的單獨項目,這是最簡單的,也就是您的nargs='*'旨在處理的內容。它應該返回Namespace(mode = ['fizz','bazz'])

您有2個選項。在傳遞給parser之前,您可以清理sys.argv。或者您可以在解析後查看args.mode屬性,並根據需要進行清理。

例如'fizz,bazz'可以拆分爲,'[fizz,bazz]'首先需要剝離[]。其他人則需要刪除額外的,'。

你可以在自定義的Action類中進行這種拆分和清理,但它不會爲你節省任何工作。


定製type也可以用來分割字符串

In [170]: def foolist(astring): 
    alist=astring.strip('[').strip(']').split(',') 
    alist = [a.strip() for a in alist if len(a)] 
    return alist 

In [171]: p=argparse.ArgumentParser() 

In [172]: p.add_argument('-m',type=foolist,nargs='*') 
Out[172]: _StoreAction(option_strings=['-m'], dest='m',... 

In [173]: p.parse_args(['-m','one','two']) 
Out[173]: Namespace(m=[['one'], ['two']]) 

In [174]: p.parse_args(['-m','one,two']) 
Out[174]: Namespace(m=[['one', 'two']]) 

In [175]: p.parse_args(['-m','[one, two]']) 
Out[175]: Namespace(m=[['one', 'two']]) 

不好的一面這是列表嵌套。可以使用默認的nargs,但它不允許使用常規的空格分隔列表。但是有標準的python方法來展開一個嵌套列表。

+0

謝謝。是的,這可以通過調用'args.mode [0] .split(',')'解析後處理,但我正在尋找一個解決方案,其中可以指定argparse來獨立處理逗號分隔的輸入。 – BoltzmannBrain

+0

然後你必須創建一個可以進行分割的自定義動作。沒有任何預定義的鐘聲或口哨聲會爲你做。看看文檔中的示例,爲所需的參數打印「values」,並處理它們。 – hpaulj

+1

我添加了一個'type'示例 – hpaulj