如何通过命令行向argparse传递kwargs(字典参数)
解决命令行向Python传递字典的问题
你猜的没错,argparse确实不支持直接定义一个接收字典的参数,完全没必要非得用pickle文件来传递,这里有两个更实用的方案:
方案一:通过JSON字符串传递
这也是你提到的成功方案,核心思路是把字典转成JSON格式的字符串,在命令行传入后,再在代码里解析回字典。
修改后的代码示例
import json def run(**kwargs): for key, value in kwargs.items(): print(f'{key}: {value}') # ...处理字典的代码 return kwargs if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Test script") # 定义一个接收JSON字符串的参数 parser.add_argument('--kwargs', type=str, required=True, description='JSON格式的字典字符串,比如{"key1":1,"key2":2}') args = parser.parse_args() # 把JSON字符串解析成字典 kwargs_dict = json.loads(args.kwargs) x = run(**kwargs_dict)
命令行调用示例
- Linux/macOS:直接用单引号包裹JSON字符串即可
python your_script.py --kwargs '{"this":1,"is":2,"a":5,"dictionary":7}' - Windows:需要用双引号包裹,并且内部的双引号要转义(或者提前去掉所有空格)
或者去掉空格后简化输入:python your_script.py --kwargs "{\"this\":1,\"is\":2,\"a\":5,\"dictionary\":7}"python your_script.py --kwargs "{\"this\":1,\"is\":2,\"a\":5,\"dictionary\":7}"
方案二:通过多个键值对参数传递
如果觉得JSON输入太繁琐,还可以让用户传入多个key=value形式的参数,再在代码里组装成字典,更适合手动输入的场景。
修改后的代码示例
def run(**kwargs): for key, value in kwargs.items(): print(f'{key}: {value}') # ...处理字典的代码 return kwargs if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Test script") # 允许传入多个key=value格式的参数 parser.add_argument('--kv', action='append', type=str, required=True, description='键值对参数,比如--kv key1=1 --kv key2=2') args = parser.parse_args() # 把键值对解析成字典 kwargs_dict = {} for kv in args.kv: key, value = kv.split('=', 1) # 如果需要转成对应类型(比如数字),可以在这里处理 try: value = int(value) except ValueError: try: value = float(value) except ValueError: pass kwargs_dict[key] = value x = run(**kwargs_dict)
命令行调用示例
python your_script.py --kv this=1 --kv is=2 --kv a=5 --kv dictionary=7
关于pickle的补充
虽然pickle可以序列化字典并通过文件传递,但不推荐直接在命令行处理未知的pickle数据,因为pickle存在安全风险,恶意构造的pickle文件可能会执行任意代码。如果不是在完全可信的环境下,优先用JSON或者键值对的方案。
内容的提问来源于stack exchange,提问作者CNIDog
相关产品推荐
相关产品推荐

