AWS EC2实例中文件存在但Python偶发FileNotFoundError求助
针对你遇到的问题,结合AWS EC2的运行环境,以下是几个常见的偶发原因及排查方向:
工作目录不匹配
你手动执行cat/head时的工作目录,和Python脚本实际运行时的工作目录可能不一致。比如你在/home/ec2-user下操作文件,但脚本如果通过crontab、systemd或其他自动化工具启动,工作目录可能是/或其他路径,导致相对路径./proData.txt找不到目标文件。
验证方法:在脚本开头添加代码打印当前工作目录:import os print(f"Current working directory: {os.getcwd()}")文件系统挂载波动或权限变更
如果文件存放在EFS、临时存储卷(如/dev/xvdh)这类网络或动态挂载的存储上,可能出现偶发的挂载断开/重连,导致短时间内文件不可见;另外,若有其他运维进程(备份、清理脚本)修改了文件/目录的权限,且执行Python脚本的用户和你手动操作的用户不一致,也可能触发问题(注:权限不足通常报PermissionError,但挂载失效会直接报FileNotFoundError)。
验证方向:用mount命令查看文件所在目录的挂载状态,检查/var/log/messages或dmesg日志是否有挂载相关报错;同时确认脚本运行用户和手动操作用户是否一致(脚本里可加print(f"Running user UID: {os.getuid()}")对比whoami输出)。文件被临时删除/移动
可能存在其他定时任务(如日志清理、数据同步脚本)在Python执行open的瞬间,删除或移动了proData.txt,而你手动执行命令时文件刚好处于存在状态。
验证方法:在脚本的异常捕获中添加目录内容检查,比如:import os prob_path = './proData.txt' try: with open(prob_path) as f: probs_by_bits = f.readline().strip().split(' ') print(probs_by_bits) except FileNotFoundError: print(f"File not found at {prob_path}, current dir contents: {os.listdir('.')}")同时查看系统进程日志,排查是否有其他进程操作该文件。
相对路径解析逻辑问题
如果你的脚本被其他脚本或程序调用,相对路径./proData.txt是相对于调用方的工作目录,而非脚本自身所在的目录。比如脚本放在/opt/scripts/下,调用方在/目录执行它,那么脚本会去/proData.txt找文件,而非/opt/scripts/proData.txt。
修复方法:改用绝对路径定位文件,确保无论脚本在哪里执行都能找到目标文件:import os script_dir = os.path.dirname(os.path.abspath(__file__)) prob_path = os.path.join(script_dir, 'proData.txt')网络存储延迟(EFS/S3挂载场景)
若文件存放在EFS或通过s3fs挂载的S3存储上,网络波动可能导致短时间内IO超时,触发偶发的FileNotFoundError。EBS本地磁盘出现这类问题的概率极低,但也可以排查IO性能指标。
验证方法:将文件复制到EC2本地磁盘(如/home/ec2-user/),运行脚本观察是否还会出现错误;同时查看AWS控制台中EFS的监控指标(IOPS、延迟)是否有异常波动。
内容的提问来源于stack exchange,提问作者Rui Liu

