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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:18:02