运行以下代码时:
KEEP=[]
for file in glob.glob("./KEEP/thing*.[tT][iI][fF]"):
m = pattern.search(file)
filename=m.group(1)
keep=Image.open(file)
keep.load()
KEEP.append(keep)
KEEP_NAMES.append(filename)
keep.close()
超过一千个文件,我收到错误消息:
Traceback (most recent call last):
File "/hom/yannis/texmf/python/remove-harakat.py", line 123, in <module>
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 2237, in open
IOError: [Errno 24] Too many open files: './KEEP/thing1118_26.TIF'
我不知道为什么会这样,因为我先加载(然后关闭)所有文件,为什么还要保持打开状态?除了减少文件数量(对我来说这不是一个选择)之外,是否有解决此问题的方法?在内存中读取了它们的内容后,有什么方法可以关闭它们?
这可能是Image.load
方法的错误-参见Pillow issue #1144。我遇到了相同的too many open files
错误-请参见#1237。
我的解决方法是将图像加载到临时对象中,进行复制,然后显式关闭该临时对象。对于您的代码,它看起来像这样:
KEEP=[]
for file in glob.glob("./KEEP/thing*.[tT][iI][fF]"):
m = pattern.search(file)
filename = m.group(1)
temp = Image.open(file)
keep = temp.copy()
KEEP.append(keep)
KEEP_NAMES.append(filename)
temp.close()
我也遇到了这个问题,并以略有不同的方法解决了这个问题。
此解决方法使用copy.deepcopy()
,它基于@indirectlit解决方案的类似逻辑,但避免创建temp
。请参见下面的代码段
import copy
KEEP=[]
for file in glob.glob("./KEEP/thing*.[tT][iI][fF]"):
m = pattern.search(file)
filename = m.group(1)
keep = copy.deepcopy(Image.open(file))
KEEP.append(keep)
KEEP_NAMES.append(filename)