我有一个命令行实用程序(exiftool),它通过stdin接受输入。
从python中调用它可能如下所示:
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(与cat不同)似乎将其输入解释为整个块,而不是逐行或根据某些分隔符。但也许有可能通过黑客攻击exiftool进程的stdin?
答案 0 :(得分:3)
库PyExifTool就是这样做的:它以批处理模式运行exiftool,使用单个分叉进程从任意数量的文件中提取元数据。作为奖励,库调用将为您解析元数据。
或者,您可以完全放弃exiftool并使用纯Python图像处理库来读取EXIF数据。推荐一个库超出了Stack Overflow的范围,但是有a closed question你可以找到一些选项。请记住,问题是七年之久,因此您应该自己检查答案的当前有效性。