我正在尝试使用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
对此不负责吗?
答案 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()
因此,如果您希望将事情关闭,则可能希望您做同样的事情。