Как передать kwargs в argparse - PullRequest
2 голосов
/ 19 марта 2020

Мне нужно передать словарь в модуль python через командную строку. Я не нашел способа заставить Python сотрудничать. Ниже приведен очень упрощенный пример того, что я хотел бы выполнить sh. Это приводит к следующей ошибке TypeError: _get_positional_kwargs() missing 1 required positional argument: 'dest' . Добавление аргумента dest в строку add_argument приводит к TypeError: __init__() got an unexpected keyword argument 'kwargs', что указывает на печальную возможность того, что argparse просто не сможет принять словарь в качестве аргумента. Является ли файл pickle единственной возможностью для передачи словарей туда и обратно из вызовов командной строки?

def run(**kwargs):
for i in kwargs.items():
    print(f'{i}: {kwargs[i]}')
# ...some code to manipulate the dictionary
return kwargs


if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Test script")
parser.add_argument(kwargs='**', description='A dictionary to be manipulated and returned')
args = parser.parse_args()
x = run(args)
pass

Дополнительная информация - я знаю, что могу передать список в *nargs аргумент с командной строкой, которая содержит аргументы, разделенные пробелом, но мне нужно сделать что-то подобное со словарем.

ОБНОВЛЕНИЕ - ЧТО РАБОТАЛО: Основываясь на полезном вводе @chepner, я смог заставить его работать с решением json, которое он упомянул в своем ответе. На моей платформе Windows мне пришлось удалить все пробелы из строки словаря, и в последней строке командной строки требуются escape-символы.

{\"this\":1,\"is\":2,\"a\":5,\"dictionary\":7}

1 Ответ

2 голосов
/ 19 марта 2020

Аргументы - это строки, точка. То, что вы хотите передать, это строка, которая содержит в кодировке dict, например, с использованием JSON.

import argparse
import json


parser = argparse.ArgumentParser()
parser.add_argument('data', type=json.loads)

args = parser.parse_args()

Если вы запускаете свой скрипт с чем-то вроде

myscript '{"foo": 3, "bar": "hello"}'

, затем args.data["foo"] == 3 и args.data["bar"] == "hello".

...