Python: передать общий словарь в качестве аргументов командной строки

У меня есть script, который должен принимать имя файла и набор пар ключ = значение. Набор пар ключ = значение не определен. Они зависят от файла, который был передан.

например:

Script.py file1 bob=1 sue=2 ben=3  # file 1 needs bob, sue, and ben

Script.py file2 mel=1 gorge=3 steve=3 # file 2 needs mel, gorge, and steve

Возможно ли это с помощью argparse/optparse или мне нужно создать собственный парсер?

Ответ 1

Это должно быть довольно легко разобрать. Использование вспомогательных библиотек было бы сложно, не зная ключей заранее. Имя файла находится в sys.argv [1]. Вы можете построить словарь со списком строк, разделенных символом '=' в качестве разделителя.

import sys
filename = sys.argv[1]
args = dict([arg.split('=', maxsplit=1) for arg in sys.argv[2:]])
print filename
print args

Вывод:

$ Script.py file1 bob=1 sue=2 ben=3
file1
{'bob': '1', 'ben': '3', 'sue': '2'}

В этом суть, но вам может понадобиться более сильный анализ пар ключ-значение, чем просто разделение строки. Кроме того, убедитесь, что у вас есть как минимум два аргумента в sys.argv, прежде чем пытаться извлечь имя файла.

Ответ 2

Надеюсь, что это поможет, вместо передачи dict вы можете передать "escaped" json string в качестве аргумента командной строки

import optparse
import json

parser = optparse.OptionParser()
parser.add_option("-t", "--test", dest="test", action="store", type="string")
options, _ = parser.parse_args()
my_dict = json.loads(options.test)
print my_dict['key1']

затем используйте его так:

python test.py -t "{\"key1\":\"value1\",\"key2\":\"value2\"}"

это выведет "value1"