Python argparse 通过命令行传递列表或字典

3

我看到有关使用argparse库将字典和列表传递给Python的问题。示例都展示了我的Python代码是什么样子的,但没有展示它们在命令行上的样子。我需要在哪里使用大括号、中括号和引号?

所以,如果我想要参数--my_dict和--my_list,我应该如何在命令行上指定它们?

这是我想要实现的核心:

Python foo.py --my_dict="{'Name': 'Zara', 'Class': 'First'}" --my_list="['a', 'b', 'c']"

请阅读以下链接中的被接受的答案:https://dev59.com/NGMl5IYBdhLWcg3wMUiP 您的“dict”实际上只是一个需要解析为字典的字符串。 - liamhawkins
查看 sys.argv[1:] 可以看到 shell 传递给你的脚本的字符串列表。你需要足够的引号来防止 shell 分割这些字符串。你需要使用括号或大括号取决于你打算如何解析结果字符串。JSON 路线提供了最大的灵活性。 - hpaulj
为什么不使用nargs ='+'来处理列表?这样,您就可以输入“--mylist a b c”,而无需添加引号或括号。 - hpaulj
通常情况下,您不会将Python代码的原始位作为参数传递。例如,有一个选项需要两个参数,并且像--student Zara First这样使用,然后从生成的元组构建适当的字典。 - chepner
@chepner,请将“--student”设置为action='append',并多次使用它,每个学生使用一次。 - hpaulj
1个回答

8

您可以使用ast.literal_eval将用户输入的字符串安全地转换为Python字典和列表:

import argparse
import ast
parser = argparse.ArgumentParser()
parser.add_argument('--my_dict', type=ast.literal_eval)
parser.add_argument('--my_list', type=ast.literal_eval)
args = parser.parse_args()
print(args)

运行中

% python script.py --my_dict="{'Name': 'Zara', 'Class': 'First'}" --my_list="['a', 'b', 'c']"

产量
Namespace(my_dict={'Name': 'Zara', 'Class': 'First'}, my_list=['a', 'b', 'c'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接