Вы определенно можете ввести что-то похожее на литерал словаря в синтаксический анализатор аргументов, но вы должны заключить это в кавычки, поэтому, когда оболочка анализирует вашу командную строку, она появляется как
- один аргумент вместо многих (символ пробела является обычным разделителем аргументов)
- правильно цитируется (оболочка удаляет кавычки во время синтаксического анализа, потому что использует их для группировки)
Таким образом, что-то вроде этого может получить текст, который вы хотели, в вашу программу:
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
сделать.
Тем не менее, очень неудобно, чтобы пользователь печатал что-то, правильно заключенное в кавычки, похожее на словарь 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'}
person
Matt Anderson
schedule
02.10.2011
echo ./script.py -i {'name': ...
), вы увидите, что видит python (в основном он не получает никаких кавычек). В вашем случае, когда в вашем параметре нет$
(который может быть интерпретирован оболочкой как переменная среды), вы можете окружить свой dict двойными кавычками:./script.py -i "{'name': 'img.png', ....}"
- person Carlos Campderrós   schedule 27.08.2015