Docker内运行mypy 0.910偶发JSONDecodeError是否为配置错误?
根因说明
你没有配置错误,该问题是mypy 0.910版本的已知缺陷导致的:
- mypy的增量检查功能会将类型解析结果以JSON格式写入
.mypy_cache目录下的缓存文件 - 0.910版本的缓存写入逻辑没有做原子性保障,当运行过程中出现进程异常终止(比如容器资源不足被OOM强制杀死、构建任务中途取消、共享存储写入延迟等场景)时,正在写入的JSON文件会被截断,没有完成完整写入
- 下次运行mypy读取损坏的缓存文件时,就会抛出你遇到的
JSONDecodeError: Unterminated string报错
解决方案
快速临时解决
不需要完整重建容器,只需要删除损坏的mypy缓存目录即可恢复正常,执行命令:
rm -rf .mypy_cache
再重新运行你的mypy命令即可。
永久规避方案
你可以根据你的使用场景选择以下任意一种方案:
- 禁用增量缓存:在原mypy命令中添加
--no-incremental参数,每次运行都会全量检查类型,不会读写缓存文件,彻底避免缓存损坏问题,适合单次运行的CI/CD场景
修改后命令参考:mypy --install-types --non-interactive --no-incremental --config-file=../setup.cfg "$@" - 增加自动重试逻辑:将mypy运行命令封装为shell脚本,首次运行失败时自动清理缓存重试,兼顾增量缓存的速度和稳定性,脚本示例:
#!/usr/bin/env bash mypy --install-types --non-interactive --config-file=../setup.cfg "$@" exit_code=$? # 识别到缓存相关错误时自动清理重试 if [ $exit_code -eq 1 ]; then rm -rf .mypy_cache mypy --install-types --non-interactive --config-file=../setup.cfg "$@" exit_code=$? fi exit $exit_code - 升级mypy版本:如果你的项目Python版本支持,可将mypy升级到0.941及以上版本,该缓存写入的原子性问题已经在后续版本修复;你当前使用的是Python3.6,最高可兼容mypy 0.971版本,可直接升级到该版本解决问题
- 容器运行优化:如果是在CI流程的容器中运行,可将
.mypy_cache目录配置为临时卷,每次任务结束后自动销毁,避免跨任务的缓存污染
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

