You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:27:35