电影的许可错误



我正在尝试使用 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")

这将给出以下错误权限错误: [WinError 32] 进程无法访问该文件,因为它正由另一个进程使用。

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

如果你想确保某些东西被关闭,你应该关闭它,而不仅仅是删除它并希望最好的结果。


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

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


事实上,从快速浏览源代码来看,看起来 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不会为你关闭。


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

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

所以,如果你想关闭事情,你可能应该做同样的事情。

最新更新