Jython2.7中shutil.copyfile偶发目标路径Errno2异常求排查方案
问题根因分析
- 网络共享瞬态故障:SMB网络路径偶发抖动、会话超时、服务器连接数满都会导致瞬间无法访问目标路径,是这类偶发IO错误的最常见诱因
- 路径拼接逻辑缺陷:当前硬编码反斜杠做路径拆分、拼接,若glob返回的源文件路径使用正斜杠分隔,
rsplit('\\',1)会提取失败,导致拼接出错误的目标路径 - 目标文件临时锁定:若刚好有其他进程(如打印池服务、文件扫描程序)正在读写同名目标文件,或前一次同文件名文件的删除操作未完成,会触发路径不存在报错
- 线程上下文差异:Ignition的多线程脚本环境下,部分线程可能未正常继承SMB共享的访问凭据,导致偶发无法访问网络路径
排查与修复方案
- 补充全链路日志,在
shutil.copyfile执行前打印dstFP、os.path.isdir('\\\\server23\\eFormz')、os.path.exists(imgFile)的返回值,出错后直接定位是路径拼接错误还是临时无法访问共享目录 - 替换路径拼接逻辑,使用
os.path.join处理目标路径拼接,避免硬编码分隔符的兼容性问题,同时新增重试逻辑应对瞬态错误,参考优化后代码:
import shutil import os import glob import time imgFiles = glob.glob(labelImage) if len(imgFiles) > 0: imgFile = imgFiles[0] if os.path.isfile(imgFile): fileName = os.path.basename(imgFile) # 替换rsplit直接取文件名,兼容性更强 dstDir = '\\\\server23\\eFormz\\' dstFP = os.path.join(dstDir, fileName) max_retry = 3 retry_cnt = 0 success = False while retry_cnt < max_retry and not success: try: shutil.copyfile(imgFile, dstFP) success = True except IOError as e: retry_cnt +=1 time.sleep(0.2) # 每次重试间隔200ms if retry_cnt == max_retry: # 可自定义错误日志输出逻辑 raise e
- 统计错误触发规律,确认报错的文件名是否存在长度超标、包含特殊字符、重名等共性特征
- 若仍未解决,可在Ignition的网关设置中调整SMB共享的连接超时时间,或映射网络驱动器替代UNC路径访问,降低网络波动影响
内容的提问来源于stack exchange,提问作者MikeA
相关产品推荐
相关产品推荐

