Python - перебирая файлы в директории, зависает на полпути - PullRequest
0 голосов
/ 10 марта 2020

У меня есть простой скрипт, настроенный с использованием 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)

Это должно l oop через все 14,5 тыс. Изображений в каталог. Тем не менее, tqdm сообщает, что сценарий выполняется только через ~ 7220 изображений, прежде чем сценарий явно зависает (tqdm перестает обновляться и больше ничего не выводится на консоль). Когда это происходит, мне нужно вручную убить процесс в терминале.

Есть ли способы диагностировать, почему скрипт зависает? Я не вижу никаких сообщений об ошибках.

1 Ответ

1 голос
/ 10 марта 2020

Что-то вроде следующего должно позволить вам l oop через все файлы перехватывать исключения и распечатывать ошибки по мере их возникновения. Обратите внимание, что в именах некоторых файлов может быть пробел, поэтому для последнего аргумента 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)
добавляется дополнительная кавычка.
...