【问题标题】:Repeating command with subprocess.Popen使用 subprocess.Popen 重复命令
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • PyExifTool 为我工作并消除了多个 fork 的开销:“由于 exiftool 以批处理模式运行,因此只需要启动一个实例,并且可以重复用于许多查询。这是比为每个查询启动一个单独的进程要高效得多。”
猜你喜欢
  • 2021-12-31
  • 2021-08-19
  • 2017-07-06
  • 1970-01-01
  • 2016-07-21
  • 2011-10-25
  • 2013-03-06
  • 2013-08-11
  • 2019-08-02
相关资源
最近更新 更多