我有一个命令行实用程序(exiftool),它通过标准输入接受输入。

从 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 进程的标准输入来实现?

最佳答案

有一个库 PyExifTool 正是这样做的:它以批处理模式运行 exiftool 以使用单个 fork 进程从任意数量的文件中提取元数据。作为奖励,库调用将为您解析元数据。

或者,您可以完全放弃 exiftool 并使用纯 Python 图像处理库来读取 EXIF 数据。推荐一个库超出了 Stack Overflow 的范围,但仍然可以在 a closed question 中找到一些选项。请记住,该问题已有七年历史,因此您应该自己检查答案的当前有效性。

关于python - 使用 subprocess.Popen 重复命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41414276/

10-13 07:40