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

Python访问服务器共享目录调用os.stat时报WinError 24错误如何处理

根本原因

你遇到的WinError 24错误存在两种完全独立的触发场景,你本地复现的打开文件数过多属于POSIX错误码EMFILE的映射,和共享目录场景下的报错为同错误码不同触发源:
共享目录下os.stat调用报错的本质是SMB会话上下文缓冲区溢出:

  • 你的Windows账号与目标SMB服务器的会话累计了大量未释放的文件元数据查询缓存、句柄碎片,当os.stat调用向SMB服务器发起文件元数据查询请求时,CPython内置os.stat实现为接收响应分配的固定长度缓冲区,小于SMB服务器实际返回的元数据长度,对应Windows SMB客户端的STATUS_BUFFER_TOO_SMALL错误被上层映射为Win32错误码24。
  • 资源管理器访问、普通文件读写等操作正常的原因是:这类操作走SMB独立请求通路,文件读写不需要拉取全量元数据,资源管理器的元数据查询自带缓冲区动态扩容逻辑,不会触发固定缓冲区长度限制。
  • 同事访问正常、重启服务器即可恢复的原因是:不同Windows账号的SMB会话相互独立,未触发缓冲区溢出阈值;重启SMB服务器会清空所有会话的上下文缓存、释放碎片,问题会临时消失。

可行解决方案

临时修复(无需重启服务器)

  • 重启本地SMB客户端服务清空会话缓存:以管理员权限执行命令net stop workstation /y && net start workstation,重建与SMB服务器的连接即可恢复正常。
  • 也可通过退出当前Windows账号重新登录的方式重置SMB会话。

代码层面兼容修复

os.stat的内置实现没有处理SMB场景下的缓冲区扩容逻辑,可替换为Windows原生API实现兼容:

  1. 调用pywin32库提供的win32file.GetFileAttributesEx接口查询元数据,该接口会自动处理响应缓冲区扩容,示例代码如下:
import win32file
import win32con

def smb_compatible_stat(path):
    info = win32file.GetFileAttributesEx(path, win32con.GetFileExInfoStandard)
    # 返回与os.stat兼容的字段
    return type('StatResult', (), {
        'st_mode': info[0],
        'st_atime': info[1],
        'st_mtime': info[2],
        'st_ctime': info[3],
        'st_size': info[4]
    })()
  1. 共享目录遍历操作可替换为win32file.FindFiles实现,完全规避对os.stat的依赖,避免触发相关错误。

永久规避

联系SMB服务器管理员调整会话缓存参数,限制单个会话的元数据缓存上限,避免出现缓冲区溢出问题。

内容的提问来源于stack exchange,提问作者Simon Streicher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:27:02