当前位置: 首页 > 面试题库 >

从python脚本调用exiftool吗?

漆雕伟志
2023-03-14
问题内容

我希望使用exiftool扫描照片和视频中的EXIF标签。这是一个perl可执行文件。推论这一点的最佳方法是什么?是否已有Python库可以执行此操作?还是应该直接调用可执行文件并解析输出?(后者似乎很脏。)谢谢。

我问的原因是因为我当前正在使用pyexiv2,该视频不支持视频。Perl的exiftool对图像和视频有非常广泛的支持,我想使用它。


问题答案:

为避免为每个图像启动新进程,应开始exiftool使用该-stay_open标志。然后,您可以通过stdin将命令发送到进程,并在stdout上读取输出。ExifTool支持JSON输出,这可能是读取元数据的最佳选择。

这是一个简单的类,它启动一个exiftool进程并提供一种execute()向该进程发送命令的方法。我还包括了get_metadata()以JSON格式读取元数据:

import subprocess
import os
import json

class ExifTool(object):

    sentinel = "{ready}\n"

    def __init__(self, executable="/usr/bin/exiftool"):
        self.executable = executable

    def __enter__(self):
        self.process = subprocess.Popen(
            [self.executable, "-stay_open", "True",  "-@", "-"],
            stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        return self

    def  __exit__(self, exc_type, exc_value, traceback):
        self.process.stdin.write("-stay_open\nFalse\n")
        self.process.stdin.flush()

    def execute(self, *args):
        args = args + ("-execute\n",)
        self.process.stdin.write(str.join("\n", args))
        self.process.stdin.flush()
        output = ""
        fd = self.process.stdout.fileno()
        while not output.endswith(self.sentinel):
            output += os.read(fd, 4096)
        return output[:-len(self.sentinel)]

    def get_metadata(self, *filenames):
        return json.loads(self.execute("-G", "-j", "-n", *filenames))

此类被编写为上下文管理器,以确保完成后退出该过程。您可以将其用作

with ExifTool() as e:
    metadata = e.get_metadata(*filenames)

编辑python 3:要使其在python 3中工作,需要进行两个小的更改。第一个是subprocess.Popen

self.process = subprocess.Popen(
         [self.executable, "-stay_open", "True",  "-@", "-"],
         universal_newlines=True,
         stdin=subprocess.PIPE, stdout=subprocess.PIPE)

第二个是您必须解码由返回的字节序列os.read()

output += os.read(fd, 4096).decode('utf-8')

Windows的EDIT:要在Windows上运行,sentinel需要将其更改为"{ready}\r\n",即

sentinel = "{ready}\r\n"

否则程序会挂起,因为execute()中的while循环不会停止



 类似资料:
  • 问题内容: 我正在尝试从python这样启动PowerShell脚本: 问题是我得到以下错误: 无法加载文件C:\ Users \ sztomi \ workspace \ myproject \ buildxml.ps1,因为在此系统上禁用了脚本的执行。请参阅“获取有关about_signing的帮助”以了解更多详细信息。 尽管事实上我很早以前确实通过键入管理员运行的PS终端来启用Powersh

  • 问题内容: 我有要从Python脚本调用的Perl脚本。我一直在寻找,并没有成功。我基本上是试图调用向Perl脚本发送1变量的方法,但是不需要Perl脚本的输出,因为它是一个自包含程序。 到目前为止,我想出的是: 只有刚刚开始的Python编程,所以我确定以上内容完全是胡说八道。任何帮助将非常感激。 问题答案: 如果您只想打开通往perl解释器的管道,那么您的方向正确。我认为您唯一缺少的是perl

  • 问题内容: 在网站上运行Selenium测试时,我有一些Flash元素无法使用Selenium / Python进行测试。我想调用一个单独的终端窗口,运行Sikuli OCR测试,然后再返回Selenium / Python测试。我还不能完全弄清楚这一点。我将XXX放在我不知道新终端打开并运行Sikuli脚本的参数的位置。 我敢肯定,这里有几处错误。任何帮助将不胜感激。我已经搜索并阅读了可以在此找

  • 问题内容: 我试图弄清楚如何从Shell脚本调用Python函数。 我有一个具有多个功能的Python文件,我需要在我的shell脚本中使用它们返回的值。有没有办法做到这一点。 我这样做是为了使用Python读取配置文件并在shell中获取值。还有其他更好的方法来实现这一目标。 包含: 我需要将Python函数返回的值存储在shell变量中。 问题答案: 您可以通过要求Python解释器打印结果来

  • 问题内容: 我有一些用PHP编写的代码,但是我还开发了一个用Python编写的脚本。是否可以从PHP代码调用此Python脚本? 如果是,如何从PHP将参数传递给Python脚本? 我试图找到一个没有成功的答案。 有人可以给我一个提示吗? 问题答案: 您使用系统功能:http : //php.net/manual/en/function.system.php 像这样:

  • 问题内容: 我对rpy2和R都是新手。 我基本上有一个R脚本script.R,其中包含函数,如rfunc(folder)。它与我的python脚本位于同一目录中。我想从Python调用它,然后启动其功能之一。我不需要此R函数的任何输出。我知道它必须非常基础,但是我找不到R脚本调用python代码的示例。我目前在Python中做什么: 我在源代码行中遇到错误: 我完全不明白我给它的参数不是字符串,而