Python3使用PIL显示图片时提示文件被移动或删除如何解决
Python3下Pillow调用show()提示文件被移动的解决方法
问题复现
实现图片打开展示的原有代码如下:
from PIL import Image r = Image.open('C:/Users/sudam/OneDrive/Desktop/programming/python/projects/good night app/morning.png' ) r.show()
运行代码后Windows照片查看器启动即报错,提示指定文件已被移动,检索到的现有解决方案均仅适配Python2环境,在Python3下无法生效。
故障原因
- Pillow库
Image.show()方法在Windows平台的默认实现存在时序缺陷:方法执行时会先将目标图片转存到系统临时目录,再唤起系统默认看图程序打开该临时文件,子进程启动后会立刻释放临时文件句柄触发自动回收,Windows照片查看器加载速度较慢,等它实际读取文件时,临时文件已经被删除,因此抛出文件已移动/不存在的错误。 - 代码里的图片路径包含空格(
good night app目录名),旧版本Pillow在Python3环境下对带空格路径的参数转义存在bug,会进一步提升该故障的触发概率。
解决方法
按操作成本从低到高排序:
- 升级Pillow到最新稳定版本,新版Pillow已经修复了Windows平台临时文件过早回收、带空格路径转义的问题,直接执行以下升级命令即可,原有代码不需要做任何修改:
pip install --upgrade pillow - 暂时不想升级Pillow的话,可以手动覆写图片打开逻辑,绕开默认的临时文件回收机制,参考代码如下:
from PIL import Image import os import tempfile img = Image.open('C:/Users/sudam/OneDrive/Desktop/programming/python/projects/good night app/morning.png') # 生成固定路径的临时文件,不会被自动回收 temp_img_path = os.path.join(tempfile.gettempdir(), "pillow_temp_show.png") img.save(temp_img_path) # 调用系统默认程序打开图片 os.startfile(temp_img_path) - 将系统默认图片查看器从旧版Windows照片查看器更换为系统自带的新版「照片」应用,新版应用加载速度更快,不存在读取文件的时序差问题,不需要修改代码即可正常运行。
注意:Python2环境下流传的修改PIL源码、调整注册表类的方案不要直接套用,Python3对应的Pillow分支已经重构了Windows端的调用逻辑,硬套老方案会触发字符串编码、路径转义类的兼容问题,无法解决问题。
内容的提问来源于stack exchange,提问作者sudam edirisinghe
相关产品推荐
相关产品推荐

