2015-03-24 1 views
3

При выполнении следующего кода:«Слишком много открытых файлов» ошибка при открытии и загрузка изображений в подушку

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' 

Я не понимаю, почему это происходит, поскольку я загружаю(), а затем закрываю() все файлы, почему они должны оставаться открытыми? Есть ли решение этой проблемы, кроме сокращения количества файлов (что для меня не является вариантом)? Какой-то способ закрыть их после того, как их содержимое было прочитано в памяти?

+0

Невозможно воспроизвести с помощью Python 3 и последней подушки. @yannis, попробуйте запустить этот скрипт http://pastebin.com/tP6E3UXE - воспроизводится ли проблема? – alexanderlukanin13

+0

'keep.close()' должно быть совершенно ненужным, так как 'keep.load()' [должен загружать данные файла и затем отбрасывать объект файла в фоновом режиме] (http://pillow.readthedocs.org/en/ последняя/ссылка/Image.html # PIL.Image.Image.close). Может быть, это имеет некоторый побочный эффект? Я все еще работаю над воспроизведением ошибки, но попытаюсь просто удалить закрытие и посмотреть, поможет ли это. – KobeJohn

+0

Также не может воспроизводить 4000 изображений в Python 2.7.8 или 3.4.1 и PILLOW 2.7.0. Вы уверены, что это настоящий код, который умирает? Интересно, может быть, вы сами открываете файл, предоставляя объект файла (а не путь) PIL, а затем случайно закрывая * Image * вместо * FIle Object * ...? Я на самом деле пробовал это, но пока еще не смог достигнуть предела открытого файла. – KobeJohn

ответ

3

Это может быть ошибка с методом Image.load - см. Pillow issue #1144. Я столкнулся с той же ошибкой too many open files - см. #1237.

Мой рабочий процесс состоял в том, чтобы загрузить изображение в объект temp, сделать копию, а затем явно закрыть темп. Для вашего кода это будет выглядеть примерно так:

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() 
+0

Обходной путь сделал трюк –