从python脚本调用exiftool吗?

从python脚本调用exiftool吗?,第1张

从python脚本调用exiftool吗?

为避免为每个图像启动新进程,应开始

exiftool
使用该
-stay_open
标志。然后,您可以通过stdin将命令发送到进程,并在stdout上读取输出。ExifTool支持JSON输出,这可能是读取元数据的最佳选择。

这是一个简单的类,它启动一个

exiftool
进程并提供一种
execute()
向该进程发送命令的方法。我还包括了
get_metadata()
以JSON格式读取元数据:

import subprocessimport osimport jsonclass 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_opennFalsen")        self.process.stdin.flush()    def execute(self, *args):        args = args + ("-executen",)        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).depre('utf-8')

Windows的EDIT:要在Windows上运行,

sentinel
需要将其更改为
"{ready}rn"
,即

sentinel = "{ready}rn"

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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5630319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存