用一個簡單的腳本,打印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方法來展開一個嵌套列表。
謝謝。是的,這可以通過調用'args.mode [0] .split(',')'解析後處理,但我正在尋找一個解決方案,其中可以指定argparse來獨立處理逗號分隔的輸入。 – BoltzmannBrain
然後你必須創建一個可以進行分割的自定義動作。沒有任何預定義的鐘聲或口哨聲會爲你做。看看文檔中的示例,爲所需的參數打印「values」,並處理它們。 – hpaulj
我添加了一個'type'示例 – hpaulj