Python 使用subprocess.Popen重复命令

Python 使用subprocess.Popen重复命令,python,subprocess,Python,Subprocess,我有一个命令行实用程序(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.wai

我有一个命令行实用程序(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
的内容作为参数传递

我可以在循环中重复调用这段代码,但每次调用都会导致
分叉,实际上速度很慢(这不是过早优化的情况)

所以我想知道是否有一种方法可以打开exiftool一次,然后“重用”Popen,将多个文件导入其中,并保存每个文件的输出

这似乎是不可能的,因为exiftool(与cat不同)似乎将其输入解释为一个完整的块,而不是逐行或根据某个分隔符。但也许可以通过破解exiftool进程的stdin?

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


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

exiftool似乎不仅是一个命令行工具,还是一个perl库。您可以编写一个perl脚本,等待程序的输入并直接调用库函数。或者,使用Python exif库而不是分叉exiftool是否在其stdin上接受多个文件?@AlastairMcCormack是的,通过David Z的回答,您可以看到PyExifTool是如何利用
-execute
参数的。这仍然有点不透明,但仍然有效。@Gribouillis我的应用程序是用Python编写的,因此使用Perl是一个禁忌。PyExifTool对我来说很有效,并且消除了多个fork的开销:“由于exiftool是以批处理模式运行的,因此只需启动一个实例,就可以重复用于许多查询。这比为每个查询启动单独的流程要高效得多。”