使用argparse传递字典字符串时出现解包错误的求助
解决Python脚本解析字典参数时的"not enough values to unpack"错误
让我来帮你排查这个问题,你遇到的not enough values to unpack (expected 2, got 1)错误根源和修复方法如下:
错误原因分析
当你用json.loads(args.dict)解析出字典后,直接用for folder, files in 字典遍历,Python默认只会遍历字典的键(比如"a"、"s"),每次循环只能拿到单个字符串,而你试图把它拆成folder和files两个变量,自然就触发了解包错误。
修复步骤及完整代码
我会分点修正你的代码,同时优化一些细节:
- 正确遍历字典的键值对:使用字典的
.items()方法,这样才能同时获取键(文件夹路径)和对应的值(文件列表) - 修正subprocess调用方式:
subprocess.call的列表参数需要将命令和参数分开传递,不能把"rm -r"作为单个元素(否则Python会把整个字符串当作命令去查找,导致执行失败) - 优化参数解析:直接给
--dict参数指定type=json.loads,让argparse自动帮你解析JSON字符串,省去手动调用json.loads的步骤
修复后的完整代码:
import argparse import subprocess as sp import json def main(): parser = argparse.ArgumentParser() # 直接指定type为json.loads,自动解析JSON参数 parser.add_argument('--dict', help='Directory and Files', required=True, type=json.loads) args = parser.parse_args() try: # 用.items()遍历字典的键值对 for folder, files in args.dict.items(): for file in files: # 拆分命令和参数为列表元素 sp.call(["rm", "-r", folder + file]) except Exception as e: print(e) if __name__ == '__main__': main()
额外注意事项
你在终端执行的命令python3 "./cleanuplogs.py" --dict='{"a":["anv", "huj"], "s":["dc", "dc"]}'是没问题的(bash环境下单引号包裹JSON字符串可以避免转义问题),如果是在其他shell(比如zsh)遇到引号解析问题,可以尝试把单引号换成双引号,同时转义JSON里的双引号:python3 "./cleanuplogs.py" --dict="{\"a\":[\"anv\", \"huj\"], \"s\":[\"dc\", \"dc\"]}"
内容的提问来源于stack exchange,提问作者pretty08
相关产品推荐
相关产品推荐

