Ubuntu环境下Python调用Exiftool修改图片元数据无效的问题求助
大家好,我现在碰到个棘手的问题,想请各位大佬帮忙看看:我在Ubuntu系统上通过sudo apt install exiftool装好Exiftool后,用which exiftool能查到它的路径是/usr/bin/exiftool,直接在终端里用Exiftool修改图片元数据完全正常,但我写了个Python脚本用subprocess调用它时,却一点效果都没有——图片的元数据根本没被修改。
附上我写的代码:
import subprocess def set_jpeg_metadata_exiftool(): exiftool_path = "exiftool" title = "Title" subject = "Subject" author = "Me" comment = "Comment" rating_val = 5 copyright_val = "Company name" keywords = 'test' cmd = [ exiftool_path, f'-Title={title}', f'-Subject={subject}', f'-Author={author}', f'-Comment={comment}', f'-Rating={rating_val}', f'-Copyright={copyright_val}', f'-Keywords={keywords}', '-overwrite_original', file_path ] subprocess.run(cmd, check=True, encoding='utf-8')
我已经确认Exiftool本身是正常工作的,但Python脚本就是没效果,有没有人能帮我排查下问题出在哪?
可能的排查方向和解决办法
我先帮你梳理几个最可能的问题点:
最明显的问题:
file_path变量未定义!
你的代码里cmd列表最后加了file_path,但整个函数里都没看到这个变量的赋值啊!你得先把要处理的图片路径明确赋值给它,比如用绝对路径file_path = "/home/xxx/your_target_image.jpg",或者在函数定义时把它作为参数传进来。如果这个变量没定义,Python运行时应该会抛出NameError,你是不是没注意到报错?试试用Exiftool的绝对路径
你现在写的exiftool_path = "exiftool"依赖系统的PATH环境变量,虽然终端里能找到,但Python脚本的运行环境PATH可能和终端不一样,换成绝对路径/usr/bin/exiftool会更稳妥,避免找不到工具的问题。检查文件权限
确认你的Python脚本运行用户有修改目标图片的权限——如果图片在root权限的目录下,或者文件本身是只读的,那就算Exiftool能找到,也没法修改。可以先给目标图片加读写权限,比如chmod +w /path/to/your/image.jpg,再试试脚本。手动验证命令是否有效
把脚本里生成的cmd命令手动复制到终端执行,比如拼出来的命令是:/usr/bin/exiftool -Title=Title -Subject=Subject -Author=Me -Comment=Comment -Rating=5 -Copyright="Company name" -Keywords=test -overwrite_original /path/to/your/image.jpg如果终端执行能生效,那就是Python脚本的问题(比如
file_path没定义);如果终端也不生效,那可能是Exiftool的参数或者图片格式的问题(比如有些图片格式不支持这些元数据标签)。捕获执行日志方便排查
你可以给subprocess.run加上捕获输出的参数,这样能看到Exiftool的执行日志,方便定位问题,比如修改代码成这样:try: result = subprocess.run(cmd, check=True, capture_output=True, encoding='utf-8') print("Exiftool执行输出:", result.stdout) except subprocess.CalledProcessError as e: print("执行出错了!错误信息:", e.stderr)
修改后的示例代码
这里给你调整了基础问题后的示例代码,你可以参考:
import subprocess def set_jpeg_metadata_exiftool(file_path): # 用绝对路径指定Exiftool位置 exiftool_path = "/usr/bin/exiftool" title = "Title" subject = "Subject" author = "Me" comment = "Comment" rating_val = 5 copyright_val = "Company name" keywords = 'test' cmd = [ exiftool_path, f'-Title={title}', f'-Subject={subject}', f'-Author={author}', f'-Comment={comment}', f'-Rating={rating_val}', f'-Copyright={copyright_val}', f'-Keywords={keywords}', '-overwrite_original', file_path ] try: result = subprocess.run(cmd, check=True, capture_output=True, encoding='utf-8') print("元数据修改成功!") print("Exiftool输出:", result.stdout) except subprocess.CalledProcessError as e: print("修改失败,错误信息:", e.stderr) # 调用函数时传入目标图片的绝对路径 if __name__ == "__main__": target_file = "/home/your_username/photos/test.jpg" # 替换成你的图片路径 set_jpeg_metadata_exiftool(target_file)
备注:内容来源于stack exchange,提问作者Agent

