可以在东西看起来像字面字典入参数解析器肯定搞定,但你因此当外壳解析您的命令行引用它,它就会出现,
- 单参数,而不是很多(空格字符是正常的参数分隔符)
- 正确引用(壳解析过程中删除引号,因为它使用它们分组)
因此,像这样可以得到你想要的文字进入你的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',....}“' –