Как удалить файл после того, как я закончу его использовать? - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь удалить файлы после того, как я их использую, но постоянно получаю сообщение об ошибке ...

Ошибка:

PermissionError: [WinError 32] Процесс не может получить доступ к файлу, потому что он используется другим процессом: '0.mp4'

Я пытался закрыть объекты, но он не работает ...

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:
    clips.append(VideoFileClip(name).resize(width=DEFAULT_WIDTH,height=DEFAULT_HEIGHT))

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

for clip in clips:
    clip.__del__()

for name in clip_names:
    os.remove(name)

Я хочу удалить файл с os.remove ...

1 Ответ

0 голосов
/ 09 февраля 2019

Вы пытались просто закрыть клипы?

for clip in clips:
    clip.close()

Из источника здесь .

Или, если вы хотите сделать это чисто в случае ошибок, используйте контекст with:

import contextlib

with contextlib.ExitStack() as stack:
    clips = []
    for name in clip_names:
        clip = VideoFileClip(name)
        stack.enter_context(contextlib.closing(clip))
        clips.append(clip.resize(width=DEFAULT_WIDTH,height=DEFAULT_HEIGHT))

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

# exiting the `with` block released the clips
for name in clip_names:
    os.remove(name)

В этом подходе для отслеживания клипов используется ExitStack.Когда программа выходит из блока with, все контексты, переданные в enter_context, закрываются, освобождая все клипы.

...