Чтобы избежать запуска нового процесса для каждого изображения, вы должны запустить exiftool
, используя флаг -stay_open
. Затем вы можете отправлять команды в процесс через stdin и читать вывод на stdout. ExifTool поддерживает вывод JSON, который, вероятно, является лучшим вариантом для чтения метаданных.
Вот простой класс, который запускает процесс exiftool
и содержит метод execute()
для отправки команд этому процессу. Я также включил get_metadata()
читать метаданные в формате JSON:
import subprocess
import os
import json
class ExifTool(object):
sentinel = "{ready}\n"
def __init__(self, executable="/usr/bin/exiftool"):
self.executable = executable
def __enter__(self):
self.process = subprocess.Popen(
[self.executable, "-stay_open", "True", "[email protected]", "-"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
return self
def __exit__(self, exc_type, exc_value, traceback):
self.process.stdin.write("-stay_open\nFalse\n")
self.process.stdin.flush()
def execute(self, *args):
args = args + ("-execute\n",)
self.process.stdin.write(str.join("\n", args))
self.process.stdin.flush()
output = ""
fd = self.process.stdout.fileno()
while not output.endswith(self.sentinel):
output += os.read(fd, 4096)
return output[:-len(self.sentinel)]
def get_metadata(self, *filenames):
return json.loads(self.execute("-G", "-j", "-n", *filenames))
Этот класс записывается как менеджер контекста, чтобы обеспечить процесс происходит выход, если вы сделали. Вы можете использовать его как
with ExifTool() as e:
metadata = e.get_metadata(*filenames)
EDIT для Python 3: Для того, чтобы получить эту работу в питона необходимо-два небольшие изменения. Первый является дополнительным аргументом в пользу subprocess.Popen
:
self.process = subprocess.Popen(
[self.executable, "-stay_open", "True", "[email protected]", "-"],
universal_newlines=True,
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
Во-вторых, вы должны декодировать серии байт, возвращаемый os.read()
:
output += os.read(fd, 4096).decode('utf-8')
Вы должны прочитать документацию модуля suprocess: HTTP://docs.python.org/library/subprocess.html – mandel
Я загрузил более полную версию кода в свой ответ на https://github.com/smarnach/pyexiftool. –