Python—在目录中的文件之间循环会中途冻结

Python—在目录中的文件之间循环会中途冻结,python,tqdm,pathlib,Python,Tqdm,Pathlib,我使用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 = s

我使用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图像。但是,在脚本明显冻结之前,TQM报告脚本仅在7220个图像中运行(TQM停止更新,不再向控制台输出任何内容)。当这种情况发生时,我需要手动终止终端中的进程


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

类似于以下内容的内容应该允许您在所有文件中循环捕获异常并在错误发生时打印。请注意,某些文件名可能包含空格,因此对
命令的最后一个参数进行了额外的引用

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)

除非你的文件是一种非常深奥的格式,否则最好使用枕头来识别文件,而不是大声呼叫Imagemagick.memory issues?或防病毒?如果
识别程序提示用户输入,则会发生这种情况。它会挂起等待,但当你在
通信中等待时,你永远看不到它。
identify
是否具有无提示运行模式?您可以执行
output,error=process.communication(timeout=somethingsane)
并处理超时异常。尝试使用
subprocess.run
并添加
timeout
argument@FredrikHedman-我怀疑
子流程。尽管超时确实是个好主意,但run
是否会起作用