可以在東西看起來像字面字典入參數解析器肯定搞定,但你因此當外殼解析您的命令行引用它,它就會出現,
- 單參數,而不是很多(空格字符是正常的參數分隔符)
- 正確引用(殼解析過程中刪除引號,因爲它使用它們分組)
因此,像這樣可以得到你想要的文字進入你的p rogram:
python MYSCRIPT.py -i "{\"name\": \"img.png\", \"voids\": \"#00ff00ff\",\"0\": \"#ff00ff00\",\"100%\": \"#f80654ff\"}"
但是,這個字符串不是dict構造函數的有效參數;相反,它是一個有效的Python代碼片段。你可以告訴你的論點解析器的這種說法的「類型」爲eval
,並且將工作:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i','--image', type=eval, help='Generate an image map...')
args = parser.parse_args()
print args
,並調用它:
% python MYSCRIPT.py -i "{\"name\": \"img.png\", \"voids\": \"#00ff00ff\",\"0\": \"#ff00ff00\",\"100%\": \"#f80654ff\"}"
Namespace(image={'0': '#ff00ff00', '100%': '#f80654ff', 'voids': '#00ff00ff', 'name': 'img.png'})
但是,這不是安全的;輸入可能是任何東西,並且您正在評估任意代碼。這將是同樣笨重,但下面會更安全:
import argparse
import ast
parser = argparse.ArgumentParser()
parser.add_argument('-i','--image', type=ast.literal_eval, help='Generate an image map...')
args = parser.parse_args()
print args
這也適用,但許多關於什麼將允許eval
「d更加嚴格。
儘管如此,讓用戶鍵入一些合適的引用,看起來像命令行上的python字典是非常困難的。而且,你必須在事實之後進行一些檢查,以確保它們傳遞到字典中,而不是其他功能,並且在其中有正確的鍵。非常容易使用,如果:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--image-name", required=True)
parser.add_argument("--void-color", required=True)
parser.add_argument("--zero-color", required=True)
parser.add_argument("--full-color", required=True)
args = parser.parse_args()
image = {
"name": args.image_name,
"voids": args.void_color,
"0%": args.zero_color,
"100%": args.full_color
}
print image
爲:
% python MYSCRIPT.py --image-name img.png --void-color \#00ff00ff --zero-color \#ff00ff00 --full-color \#f80654ff
{'100%': '#f80654ff', 'voids': '#00ff00ff', 'name': 'img.png', '0%': '#ff00ff00'}
您可以從外部文件或標準輸入讀取的格式,如JSON,然後解析它。所以你argparse類型實際上是一個文件。 –
@wim在他的回答中說shell在將它們傳遞給python之前正在處理這些參數。如果你用'echo'('echo ./script.py -i {'name':...'')你會看到什麼python看到(主要是它沒有收到任何報價)。在你的情況下,你的param中沒有'$'(可以被shell解釋爲一個環境變量),你可以用雙引號括住你的dict:'./script.py -i「{'name':' img.png',....}「' –