2017-01-01 3 views
3

У меня есть утилита командной строки (exiftool), которая принимает входные данные через stdin.Повторяя команду с subprocess.Popen

Назвав его из питона может выглядеть следующим образом:

ps = Popen(['exiftool','-groupNames','-json', '-'], stdin=PIPE, stdout=PIPE) 

Если труба используется через:

with open(ffile, 'r') as fh: 
    ps.stdin.write(fh.read()) 
ps.stdin.close() 
print ps.stdout.read() 
ps.wait() 

Как и ожидалось, это выводит результат выполнения ExifTool с содержанием ffile прошло как аргумент.

Я могу называть этот код многократно в цикле, но для каждого вызова он вызывает fork и на самом деле медленный (это не случай преждевременной оптимизации).

Так что мне интересно, есть ли способ открыть exiftool один раз, а затем «повторно использовать» Popen, подключая к нему несколько файлов и сохраняя выходные данные для каждого из них.

Не похоже, что это возможно, потому что exiftool (в отличие от кошки), кажется, интерпретирует его вход как целый кусок, вместо строки за строкой или в соответствии с каким-то разделителем. Но, возможно, это возможно, взломав stdin процесса exiftool?

+2

Кажется, что exiftool - это не только инструмент командной строки, но и библиотека perl. Возможно, вы можете написать perl-скрипт, который ждет ввода вашей программы и напрямую вызывает функции библиотеки. – Gribouillis

+1

Или, используйте exif-библиотеку Python, а не forking out –

+0

Выполняет ли exiftool несколько файлов на своем stdin? –

ответ

3

Существует библиотека PyExifTool, которая выполняет именно это: она запускает exiftool в пакетном режиме для извлечения метаданных из любого количества файлов с использованием одного разветвленного процесса. В качестве бонуса вызовы библиотеки будут анализировать метаданные для вас.

В качестве альтернативы вы можете полностью отказаться от exiftool и использовать библиотеку обработки изображений с использованием чистого Python для чтения данных EXIF. Рекомендация библиотеки выходит за рамки для переполнения стека, но, тем не менее, есть a closed question, где вы можете найти некоторые варианты. Имейте в виду, что вопрос составляет семь лет, поэтому вы должны сами проверить текущую обоснованность ответов.

+0

PyExifTool работал для меня и устранял накладные расходы нескольких вилок: ** «Поскольку exiftool запускается в пакетном режиме, нужно запускать только один экземпляр и его можно повторно использовать для многих запросов. Это намного эффективнее, чем запуск отдельного процесса для каждого отдельного запроса». * * – g33kz0r

Смежные вопросы