Python监控共享文件夹报PermissionError: [WinError 31]求助
问题:监控文件服务器共享路径时触发WinError 31错误
用户实现了一个基于Watchdog的程序,用于监控文件服务器共享路径并处理文件数据插入数据库,代码如下:
class MetrologyObserver(object): def __init__(self, root_path): self.root_path = root_path self.event_handler = MetrologyEventHandler() self.event_observer = Observer() def run(self): self.schedule() self.start() try: while True: time.sleep(1) except KeyboardInterrupt: self.stop() self.event_observer.join() def start(self): self.event_observer.start() def stop(self): self.event_observer.stop() def schedule(self): self.event_observer.schedule(self.event_handler, self.root_path, recursive=True) if __name__ == "__main__": src_path = r'\\shared folder path' MetrologyObserver(src_path).run()
执行程序时出现以下错误:
File "C:\Users\xxxxx\Anaconda3\lib\site-packages\watchdog\observers\winapi.py", line 112, in _errcheck_handle
raise ctypes.WinError()
PermissionError: [WinError 31] A device attached to the system is not functioning.
排查与解决办法
验证共享路径权限
确保运行程序的Windows账户对目标共享路径拥有读取、列出目录的权限,必要时添加修改权限。先手动访问共享路径确认权限正常,若手动访问失败,优先调整系统共享权限配置。规避Watchdog的SMB兼容性问题
Watchdog的Windows后端依赖WinAPI,对SMB网络共享的监控支持存在局限性,WinError 31多由此引发,可通过两种方式解决:- 映射网络驱动器:将共享路径映射为本地驱动器(如Z:\),修改代码中
src_path为映射后的路径(r'Z:\')。映射时勾选“登录时重新连接”,保证权限持久有效。 - 改用定时轮询方案:放弃实时事件监听,用定时扫描替代。示例代码如下:
import os import time def process_files_in_shared(path): for root, _, files in os.walk(path): for file_name in files: full_path = os.path.join(root, file_name) # 此处添加读取文件、插入数据库的逻辑 print(f"处理文件:{full_path}") if __name__ == "__main__": src_path = r'\\shared folder path' scan_interval = 300 # 每5分钟扫描一次 while True: process_files_in_shared(src_path) time.sleep(scan_interval)
- 映射网络驱动器:将共享路径映射为本地驱动器(如Z:\),修改代码中
检查运行账户权限(服务场景)
若程序以Windows服务形式运行,默认服务账户权限受限,需为服务账户配置共享路径访问权限,或切换为具备管理员权限的账户运行服务。排查网络稳定性
WinError 31也可能因共享连接不稳定导致,检查本地与文件服务器的网络连接,重启相关网络设备或服务器,确保共享路径可稳定访问。
内容的提问来源于stack exchange,提问作者user2207791
相关产品推荐
相关产品推荐

