Python程序读取pos.json时随机报FileNotFound异常求助
你的代码存在一个小隐患:直接使用open('./autoGen/pos.json', 'r').read()会导致文件句柄没有被显式关闭,虽然Python的垃圾回收机制会处理,但高频率调用时可能引发问题——不过这不是你遇到的随机10-20分钟无法读取文件、之后自动恢复的核心原因。结合你的场景,以下是最可能的成因和对应的解决思路:
文件被其他进程临时操作
大概率是有其他程序在这段时间内对pos.json进行了操作:- 生成该文件的脚本可能采用了“先删除原文件再重新创建”的逻辑,这会产生短暂的文件不存在窗口;
- 备份工具、杀毒软件可能临时锁定或移动文件,完成后再恢复;
- 其他进程以独占模式打开了文件,导致你的读取请求被阻塞(部分系统会将这种阻塞返回为FileNotFound)。
解决:给读取逻辑增加重试机制,同时检查生成pos.json的程序,尽量改成“先写入临时文件,再替换原文件”的原子操作方式,避免出现文件不存在的间隙。
相对路径的动态变化
你使用的./autoGen/pos.json是相对路径,但Python的当前工作目录(CWD)可能被程序中的其他操作(比如调用os.chdir()、或者启动脚本的方式)修改,导致临时找不到文件。
解决:改用绝对路径读取文件,同时用with语句确保文件正确关闭,代码示例:import json import os # 获取当前脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(script_dir, 'autoGen', 'pos.json') with open(file_path, 'r') as f: currentGen = json.load(f)网络/远程文件系统的延迟
如果autoGen目录在网络共享盘、NAS或云存储上,文件系统的缓存机制可能导致文件变更无法及时被读取端感知,甚至临时出现路径解析失败。
解决:增加存在性检查和重试逻辑,比如:import json import os import time def read_pos_file(): script_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(script_dir, 'autoGen', 'pos.json') max_retries = 6 # 重试6次,总等待约10秒,可根据情况调整 retry_interval = 2 for _ in range(max_retries): if os.path.exists(file_path): try: with open(file_path, 'r') as f: return json.load(f) except Exception as e: print(f"读取失败,重试中: {str(e)}") time.sleep(retry_interval) raise FileNotFoundError(f"重试{max_retries}次后仍无法读取文件: {file_path}") currentGen = read_pos_file()系统权限的临时变更
部分系统的权限管理工具(如Linux的SELinux、Windows的UAC)可能临时调整了文件或目录的权限,导致你的Python进程无法访问,之后自动恢复。
解决:查看系统日志(Linux的/var/log/syslog、Windows的事件查看器),排查这段时间内是否有相关权限变更记录;确保运行Python程序的用户对autoGen目录和pos.json文件拥有持续的读取权限。
内容的提问来源于stack exchange,提问作者Carmelo

