Циклический просмотр изображений в python с использованием подпроцесса Popen и PIPE

У меня есть папка с кучей изображений. Я пытаюсь написать скрипт на Python, который будет проходить через каждое изображение и возвращать ширину / высоту, а затем добавлять его в мой словарь. Упрощенная версия моего словаря выглядит так:

in_metadata = {123: {labels:[1,2]}, 234: {labels:[2,3]}}

и что я хочу это:

in_metadata = {123: {'labels':[1,2], 'bbox':[320,240,640,480]}, 234: {'labels':[2,3], 'bbox':[320,206,640,412]}, ...}

где bbox = [центр х, центр у, ш, ч]

Когда код входит в первую итерацию цикла, я получаю:

stdout = '640,480'

чего я и ожидаю Тем не менее, во второй раз через цикл я получаю:

stdout = '640,480640,412'

Первые значения ширины и высоты не сбрасываются. Вот мой код:

command = ['identify', '-format', '%[fx:w],%[fx:h]']
for img_id, img_dict in in_metadata.iteritems():
    if 'bbox' in img_dict:
        continue
    command.append(srcdir + 'images/' + str(img_id) + '.jpg')
    p = Popen(command, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()
    if len(stderr) != 0:
        continue
    w, h = map(int, stdout.split(','))
    img_dict['bbox'] = [int(w / 2), int(h / 2), w, h]
    stdout.flush()

У меня все проблемы сумасшествия, пытаясь заставить это работать (p.wait, stdout.flush и т. Д.), Но буфер не хочет казаться пустым. Я знаю, что это что-то простое, что мне не хватает?

Благодарю.

Я использую Python 2.7.12 на Ubuntu 16.04

2 ответа

Каждая итерация, ваш command добавляется в. Я подозреваю, что вы действительно не хотите этого. Рассмотрим эту упрощенную версию вашего кода:

labels = 'LABELS'
srcdir = 'SRCDIR/'
in_metadata = {123: {labels:[1,2]}, 234: {labels:[2,3]}}
command = ['identify', '-format', '%[fx:w],%[fx:h]']

for img_id, img_dict in in_metadata.iteritems():
    command.append(srcdir + 'images/' + str(img_id) + '.jpg')
    print command

Выход:

['identify', '-format', '%[fx:w],%[fx:h]', 'SRCDIR/images/234.jpg']
['identify', '-format', '%[fx:w],%[fx:h]', 'SRCDIR/images/234.jpg', 'SRCDIR/images/123.jpg']

Вы, вероятно, хотите что-то вроде этого:

base_command = ['identify', '-format', '%[fx:w],%[fx:h]']

for img_id, img_dict in in_metadata.iteritems():
    command = base_command + [srcdir + 'images/' + str(img_id) + '.jpg']
    ...

Если вы запускаете это из Bash, вы можете попробовать установить PYTHONUNBUFFERED перед запуском вашего скрипта?

export PYTHONUNBUFFERED=true
Другие вопросы по тегам