moviepy权限错误

时间:2018-08-19 23:46:12

标签: python moviepy

我正在尝试使用moviepy将mp4视频转换为mp3音频,然后删除该视频,代码如下:

import moviepy.editor as mp
#converting mp4 to mp3
clip = mp.VideoFileClip("videos/test.mp4")
clip.audio.write_audiofile("test.mp3")
del clip

#delete video file after converting
os.remove("videos/test.mp4")
print("Video Deleted")

这将出现以下错误PermissionError:[WinError 32]该进程无法访问文件,因为该文件正在被另一个进程使用。

我知道我应该关闭mp4文件上的进程以关闭它,例如处理文件,但是del clip对此不负责吗?

1 个答案:

答案 0 :(得分:1)

如果您要确保关闭某个内容,则应该关闭它,而不仅仅是删除它并希望获得最好的效果。


首先,del clip并没有真正删除对象。它只是删除变量clip。如果clip是对该对象的唯一引用,则它将成为垃圾。如果使用的是CPython,并且没有循环引用,则将立即检测到垃圾并删除该对象。但是,如果这三个if中的任何一个都不成立,那就不会。

第二,即使您实际上删除了该对象,也不能保证它将关闭所有内容。当然,这就是文件对象的工作方式,也是管理外部资源的其他对象应该工作的方式,如果没有充分的理由要这么做的话,但实际上不是由语言强制执行的,有时是是一个很好的理由,或者有时,库的0.2版本还没有写出所有清理代码。


事实上,从快速浏览the source来看,MoviePy 是在删除时不自动关闭的充分理由:

    #    Implementation note for subclasses:
    #
    #    * Memory-based resources can be left to the garbage-collector.
    #    * However, any open files should be closed, and subprocesses should be terminated.
    #    * Be wary that shallow copies are frequently used. Closing a Clip may affect its copies.
    #    * Therefore, should NOT be called by __del__().

所以,不,del clip不会为您结账。


如果您查看模块文档字符串中的示例,例如this one,它们将显式调用close

    >>> from moviepy.editor import VideoFileClip
    >>> clip = VideoFileClip("myvideo.mp4").subclip(100,120)
    >>> clip.write_videofile("my_new_video.mp4")
    >>> clip.close()

因此,如果您希望将事情关闭,则可能希望您做同样的事情。