Python脚本间调用传递含列表的字典参数时JSON报错求助
解决Python脚本间传递含列表的字典参数时的JSON解析错误
这个问题我碰到过好几次了,核心原因是shell会拆分你的JSON字符串参数——当你用os.system直接拼接命令时,JSON里的空格、引号等特殊字符会被shell当作参数分隔符,导致a.py里的sys.argv[1:]拿到的不是完整的JSON字符串,而是被拆成多个元素的列表,这就是为什么会报错JSON object must be str, bytes or bytearray, not 'list'。
下面给你两种可行的解决方案:
方案一:用subprocess.run替代os.system(推荐)
subprocess模块是Python官方推荐的替代os.system的工具,它可以直接传递参数列表,完全避免shell解析参数的问题,代码更安全也更易维护。
修改scheduler.py:
import subprocess import json t = {"code": 161123134, "name": "task2", "domain": "www.google.com", "type": "Type1", "keywords": ["bai2", "yin4", "jiao3", "yi8", "ping1", "tai3"]} hourTasks = json.dumps(t) # 用参数列表传递,整个JSON字符串会作为一个完整的参数传给a.py subprocess.run(["python", "a.py", hourTasks])
修改a.py:
import sys import json # 直接取sys.argv[1],它就是完整的JSON字符串 task = json.loads(sys.argv[1]) # 可以打印验证一下 print("接收到的参数:", task)
方案二:对JSON字符串进行shell转义(兼容旧代码)
如果一定要保留os.system,需要用shlex.quote对JSON字符串进行转义,确保shell把它当作一个整体参数处理。
修改scheduler.py:
import os import json import shlex t = {"code": 161123134, "name": "task2", "domain": "www.google.com", "type": "Type1", "keywords": ["bai2", "yin4", "jiao3", "yi8", "ping1", "tai3"]} hourTasks = json.dumps(t) # 用shlex.quote转义特殊字符,避免shell拆分参数 os.system(f"python a.py {shlex.quote(hourTasks)}")
同样修改a.py为取sys.argv[1]:
import sys import json task = json.loads(sys.argv[1]) print("接收到的参数:", task)
为什么原来的代码不行?
举个简单例子,你的JSON字符串里有空格(比如"name": "task2"里的空格),shell会把这个字符串拆成多个部分,sys.argv就会变成类似['a.py', '{"code":', '161123134,', ...]的列表,你用json.loads去解析这个列表自然会报错。
内容的提问来源于stack exchange,提问作者Ekoar
相关产品推荐
相关产品推荐

