Python - 循环遍历目录中的文件中途冻结

Python - Looping through files in directory freezes mid-way

我有一个使用 ImageMagick 设置的简单脚本,用于删除目录中大小不是 157x200 像素的所有图像:

import subprocess, os, sys
from tqdm import tqdm
from pathlib import Path


def delete_opaque_files():
    pathlist = Path("faces").glob('*.png')
    for path in tqdm(pathlist):
        path_str = str(path)
        command = f"identify -format '%wx%h' {path_str}"
        process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
        output, error = process.communicate()
        if output.decode("utf-8") != "'157x200'":
            print(f"Deleting: {path_str}")
            os.remove(path_str)


delete_opaque_files()
sys.exit(0)

它应该循环遍历目录中的所有 14.5k 图像。然而,在脚本明显冻结之前,tqdm 报告脚本 运行 仅通过 ~7220 个图像(tqdm 停止更新并且没有更多输出到控制台)。发生这种情况时,我需要在终端中手动终止进程。

有什么方法可以诊断脚本冻结的原因吗?我没有看到任何错误输出。

像下面这样的东西应该允许您循环遍历所有文件以捕获异常并在它们发生时打印错误。请注意,某些文件名可能包含 space,因此 command.

的最后一个参数需要额外引号
import subprocess
import os
import sys
from tqdm import tqdm
from pathlib import Path


def delete_opaque_files():
    pathlist = Path("faces").glob('*.png')
    for path in tqdm(pathlist):
        path_str = str(path)
        command = ["identify", "-format" "'%wx%h'", f"'{path_str}'"]
        try:
            process = subprocess.run(command,
                                     capture_output=True, check=True,
                                     encoding='utf-8', timeout=15)
            if process.stdout != "'157x200'":
                print(f"Deleting: {path_str}")
                os.remove(path_str)
        except subprocess.TimeoutException as err:
            print(f'Timed out on {path_str}: {err}')
        except subprocess.CalledProcessError as err:
            print(f'Error processing {path_str}: {err}')


delete_opaque_files()
sys.exit(0)