Вызовите exiftool из скрипта python?

Я ищу использовать exiftool для сканирования тегов EXIF ​​из моих фотографий и видео. Это исполняемый файл perl. Каков наилучший способ сделать это? Существуют ли библиотеки Python для этого? Или мне нужно напрямую вызвать исполняемый файл и проанализировать вывод? (Последний кажется грязным.) Спасибо.

Причина, по которой я спрашиваю, заключается в том, что в настоящее время я использую pyexiv2, у которого нет поддержки для видео. Perl exiftool имеет очень широкую поддержку для изображений и видео, и я хотел бы использовать его.

    One Solution collect form web for “Вызовите exiftool из скрипта python?”

    Чтобы избежать запуска нового процесса для каждого изображения, вы должны запустить exiftool с -stay_open флага -stay_open . Затем вы можете отправлять команды в процесс через stdin и читать вывод на stdout. ExifTool поддерживает вывод JSON, который, вероятно, является лучшим вариантом для чтения метаданных.

    Вот простой класс, который запускает процесс exiftool и имеет метод exceute() для отправки команд этому процессу. Я также включил 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", "-@", "-"], 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:
    Чтобы заставить это работать на python 3, необходимы два небольших изменения. Первый – дополнительный аргумент для подпроцесса.Popen:

     self.process = subprocess.Popen( [self.executable, "-stay_open", "True", "-@", "-"], universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

    Во-вторых, вам нужно декодировать байтовую строку, возвращаемую os.read ():

     output += os.read(fd, 4096).decode('utf-8') 
      Python - лучший язык программирования в мире.