【发布时间】:2017-01-01 23:47:40
【问题描述】:
我有一个命令行实用程序 (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 进程的标准输入来实现?
【问题讨论】:
-
看来exiftool不仅仅是一个命令行工具,它还是一个perl库。您或许可以编写一个等待程序输入并直接调用库函数的 perl 脚本。
-
或者,使用 Python exif 库而不是分叉
-
exiftool 是否接受其标准输入中的多个文件?
-
@AlastairMcCormack 是的,通过 David Z 的回答,您可以看到 PyExifTool 如何在此处利用
-execute参数:github.com/smarnach/pyexiftool/blob/master/exiftool.py#L200。这仍然有点不透明,但有效。 -
@Gribouillis 我的应用程序是用 Python 编写的,所以使用 Perl 是不行的。
标签: python subprocess