paramiko 库 sftp从远程获取文件到本地get()方法出现s = os.stat(localpath)FileNotFoundError: [Errno 2] No such file 异常

作者遇到的问题是,在使用Python的SFTP库搬运视频文件时,由于视频被处理脚本迅速删除,导致get方法在文件尚未完全写入本地时检测到大小不一致,引发Nosuchfile异常。解决方案涉及到同步搬运和处理流程,避免文件未完全下载就删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近在做一个项目,需要一个脚本从远程服务器视频搬运到本地文件夹,另一个脚本监控本地文件夹,对文件夹里面的视频文件进行处理;处理脚本逻辑:监测到有视频,就开始处理视频,视频处理完,删除视频。

问题

我遇见的问题,从远程服务器搬运视频过来出现No such file 异常

分析

我的视频其实是搬运过来了,但是出现这个错误的原因是,视频搬到本地就被视频处理脚本处理删除掉了,而搬运的get方法如下:

get方法源码部分

with open(localpath, "wb") as fl:
    size = self.getfo(
        remotepath,
        fl,
        callback,
        prefetch,
        max_concurrent_prefetch_requests,
    )
s = os.stat(localpath)
if s.st_size != size:
    raise IOError(
        "size mismatch in get!  {} != {}".format(s.st_size, size)
    )

这段代码的意思

  1. 打开一个本地文件 localpath 以二进制写入('wb' 模式),准备将从远程服务器获取的数据写入此文件。  
  2. 使用 self.getfo()方法从远程服务器获取文件数据并写入本地文件。self.getfo() 通常是 Paramiko SFTP 客户端的方法,用于从远程服务器下载文件。
  3. 获取本地文件 localpath 的状态信息,包括文件大小等。os.stat(localpath) 返回一个包含文件状态信息的对象。
  4. 检查从远程服务器下载的数据的大小 size 是否与本地文件的大小相匹配。如果大小不匹配,则抛出 IOError 异常,指示文件大小不一致。  

而正好与我的监控脚本冲突,他视频刚搬运过来,监控脚本很快就处理完,随后删除视频,而get方法的os.stat(localpath)这行代码正好读取不到视频,所有会报错。

``` import paramiko, re, time from datetime import datetime from config02 import userlist from threading import Thread import os # 新增导入 class SW(): def __init__(self): self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(hostname="192.168.100.1", port=22, username="python", password="Huawei@123", allow_agent=False, look_for_keys=False) self.vty = self.ssh.invoke_shell() print("ssh 连接成功") self.send_com("screen-length 0 temporary") def send_com(self, com): self.vty.send(com + "\n") time.sleep(2) return self.vty.recv(65535).decode("utf-8") def jhjzt(self): while True: p_list = [] for i in userlist.keys(): pat = self.send_com(userlist[i]["com"]) res = re.compile(userlist[i]["re"]).findall(pat) if i == "fan": res = res if res else "all fan are faulty" p_list.append(f"{i}:{res}") # 创建日期目录逻辑 current_date = datetime.now().strftime("%Y-%m-%d") # 生成日期字符串 target_dir = os.path.join(r"E:\PYTHON", current_date) # 拼接目标路径 os.makedirs(target_dir, exist_ok=True) # 自动创建目录(存在则不创建) file_path = os.path.join(target_dir, "device_status.txt") # 新文件路径 with open(file_path, 'w') as f: f.write(pat) print("\n".join(p_list)) time.sleep(60 * 5) def xiazai(self): while True: current_date = datetime.now().strftime("%Y-%m-%d") target_dir = os.path.join(r"E:\PYTHON", current_date) os.makedirs(target_dir, exist_ok=True) file_name = f"{datetime.now().strftime('%H-%M-%S')}_X_T1_AGG1.zip" # 按时间命名文件 file_path = os.path.join(target_dir, file_name) with paramiko.Transport(("192.168.100.1", 22)) as t: t.connect(username="python", password="Huawei@123") sftp = paramiko.SFTPClient.from_transport(t) sftp.get("/vrpcfg.zip", file_path) # 保存到日期目录 print("下载成功") time.sleep(60 * 60 * 24) def binfa(self): Thread(target=self.jhjzt).start() Thread(target=self.xiazai).start() if __name__ == '__main__': SW().binfa()```Exception in thread Thread-4: Traceback (most recent call last): File "E:\Users\zzChen\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner self.run() File "E:\Users\zzChen\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "E:/PYTHON/tets011/test03.py", line 63, in xiazai sftp.get("/vrpcfg.zip", file_path) # 保存到日期目录 File "E:\PYTHON\tets011\venv\lib\site-packages\paramiko\sftp_client.py", line 840, in get size = self.getfo( File "E:\PYTHON\tets011\venv\lib\site-packages\paramiko\sftp_client.py", line 795, in getfo file_size = self.stat(remotepath).st_size File "E:\PYTHON\tets011\venv\lib\site-packages\paramiko\sftp_client.py", line 493, in stat t, msg = self._request(CMD_STAT, path) File "E:\PYTHON\tets011\venv\lib\site-packages\paramiko\sftp_client.py", line 857, in _request return self._read_response(num) File "E:\PYTHON\tets011\venv\lib\site-packages\paramiko\sftp_client.py", line 909, in _read_response self._convert_status(msg) File "E:\PYTHON\tets011\venv\lib\site-packages\paramiko\sftp_client.py", line 938, in _convert_status raise IOError(errno.ENOENT, text) FileNotFoundError: [Errno 2] No such file Process finished with exit code -1
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值