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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:40