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

多SFTP操作遇[Errno13]文件传输中无法执行操作错误求助

问题解决:SFTP下载后删除报错“传输中无法执行操作”

问题场景

通过Airflow执行SFTP文件下载至GCS后删除原文件的操作时,某一台SFTP服务器持续报错,其他服务器运行正常:

[Errno 13] The requested operation cannot be performed because there is a file transfer in progress

已确认相同凭证手动下载删除无权限问题。

核心原因

原代码中通过sftp_client.file()获取的文件对象proxy_obj未被正确关闭,导致SFTP服务器认为文件传输会话仍在进行,锁定文件阻止删除操作。部分SFTP服务器对文件句柄的释放检查较为严格,必须显式关闭文件对象后才能执行删除。

修复方案

方法1:使用上下文管理器自动关闭文件对象

修改代码,用with语句包裹文件对象操作,确保代码块结束后自动关闭文件句柄:

with ssh_hook_SFTP.get_conn() as ssh_client:
    sftp_client = ssh_client.open_sftp()

    bucket = storage_bucket_client.get_bucket(target_bucket)
    # 上下文管理器自动处理文件关闭
    with sftp_client.file(sftp_file_path) as proxy_obj:
        blob = Blob(gcp_bucket_path, bucket)
        blob.upload_from_file(proxy_obj)

    log.info(f'Executing delete of {sftp_file_path}')
    sftp_client.remove(sftp_file_path)

方法2:手动显式关闭文件对象

如果无法使用上下文管理器,可在上传完成后手动调用close()方法释放资源:

with ssh_hook_SFTP.get_conn() as ssh_client:
    sftp_client = ssh_client.open_sftp()

    bucket = storage_bucket_client.get_bucket(target_bucket)
    proxy_obj = sftp_client.file(sftp_file_path)
    try:
        blob = Blob(gcp_bucket_path, bucket)
        blob.upload_from_file(proxy_obj)
    finally:
        # 确保无论上传是否成功,都关闭文件对象
        proxy_obj.close()

    log.info(f'Executing delete of {sftp_file_path}')
    sftp_client.remove(sftp_file_path)

验证方式

修改代码后重新触发Airflow任务,检查特定SFTP服务器上的文件删除操作是否正常执行,确认报错不再出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:45:49