У меня есть утилита командной строки (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?
Кажется, что exiftool - это не только инструмент командной строки, но и библиотека perl. Возможно, вы можете написать perl-скрипт, который ждет ввода вашей программы и напрямую вызывает функции библиотеки. – Gribouillis
Или, используйте exif-библиотеку Python, а не forking out –
Выполняет ли exiftool несколько файлов на своем stdin? –