背景
最近在做一个项目,需要一个脚本从远程服务器视频搬运到本地文件夹,另一个脚本监控本地文件夹,对文件夹里面的视频文件进行处理;处理脚本逻辑:监测到有视频,就开始处理视频,视频处理完,删除视频。
问题
我遇见的问题,从远程服务器搬运视频过来出现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)
)
这段代码的意思
- 打开一个本地文件 localpath 以二进制写入('wb' 模式),准备将从远程服务器获取的数据写入此文件。
- 使用 self.getfo()方法从远程服务器获取文件数据并写入本地文件。self.getfo() 通常是 Paramiko SFTP 客户端的方法,用于从远程服务器下载文件。
- 获取本地文件 localpath 的状态信息,包括文件大小等。os.stat(localpath) 返回一个包含文件状态信息的对象。
- 检查从远程服务器下载的数据的大小 size 是否与本地文件的大小相匹配。如果大小不匹配,则抛出 IOError 异常,指示文件大小不一致。
而正好与我的监控脚本冲突,他视频刚搬运过来,监控脚本很快就处理完,随后删除视频,而get方法的os.stat(localpath)这行代码正好读取不到视频,所有会报错。