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

使用os.remove删除视频文件遭遇PermissionError问题求助

解决moviepy使用后删除文件的PermissionError问题

这个错误很常见,本质是原视频文件的句柄还被moviepy的内部对象或后台ffmpeg进程占用着,你手动调用__del__()的方式并不靠谱——Python的垃圾回收机制不会立即执行这个方法,而且moviepy的内部实现里,__del__也未必能彻底释放所有关联的资源。

正确的解决方案:显式关闭所有Clip对象

MoviePy的VideoFileClip和拼接后的final_clip都提供了close()方法,这才是官方推荐的资源释放方式。我们需要在完成视频处理后,依次关闭所有相关的Clip对象,确保文件句柄被完全释放。

修改后的代码如下:

import os
from moviepy.editor import VideoFileClip, concatenate_videoclips

DEFAULT_HEIGHT = 720
DEFAULT_WIDTH = 1280
clip_names = ["0.mp4", "1.mp4"]
clips = []

for name in clip_names:
    # 1. 创建原始Clip对象
    raw_clip = VideoFileClip(name)
    # 2. 调整尺寸得到新的Clip
    resized_clip = raw_clip.resize(width=DEFAULT_WIDTH, height=DEFAULT_HEIGHT)
    clips.append(resized_clip)
    # 3. 立即关闭原始Clip,释放原文件句柄(resize后的Clip已不依赖原文件)
    raw_clip.close()

final_clip = concatenate_videoclips(clips)
final_clip.write_videofile("video.mp4")

# 4. 关闭所有调整后的子Clip
for clip in clips:
    clip.close()

# 5. 关闭最终拼接的Clip
final_clip.close()

# 现在可以安全删除文件了
for name in clip_names:
    os.remove(name)

额外优化:使用上下文管理器自动管理资源

如果你想避免手动调用close(),可以用Python的with语句(上下文管理器)来自动释放资源,这样代码更简洁,也不容易遗漏:

import os
from moviepy.editor import VideoFileClip, concatenate_videoclips

DEFAULT_HEIGHT = 720
DEFAULT_WIDTH = 1280
clip_names = ["0.mp4", "1.mp4"]
clips = []

for name in clip_names:
    with VideoFileClip(name) as raw_clip:
        # 在with块内调整尺寸,raw_clip会在块结束时自动关闭
        resized_clip = raw_clip.resize(width=DEFAULT_WIDTH, height=DEFAULT_HEIGHT)
        # 将resize后的Clip内容加载到内存,避免依赖原文件
        resized_clip = resized_clip.copy()
        clips.append(resized_clip)

final_clip = concatenate_videoclips(clips)
final_clip.write_videofile("video.mp4")

# 关闭所有子Clip和最终Clip
for clip in clips:
    clip.close()
final_clip.close()

for name in clip_names:
    os.remove(name)

这里的copy()方法会把resize后的视频内容加载到内存,确保原文件在with块结束后完全被释放,不会影响后续的删除操作。

极端情况:强制等待ffmpeg进程退出

如果以上方法还是不行,可能是后台ffmpeg进程没有完全退出,可以在删除前添加短暂延迟:

import time
# ... 前面的代码 ...
final_clip.close()
# 等待2秒,让后台进程完全退出
time.sleep(2)
for name in clip_names:
    os.remove(name)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:24:53