UnsupportedOperation: fileno - Как исправить эту проблему с зависимостями Python?

Я создаю довольно обширный бэкэнд Python, и на сервере А. все работает довольно хорошо. Затем я установил систему на новый (разрабатываемый) сервер B, на котором просто заново установил все пакеты pip с нуля. Вещи, казалось, работали нормально, поэтому я сделал pip freeze, Затем я взял этот список и обновил пакеты на сервере А.

Но, как и следовало ожидать, я должен был знать лучше. Я не достаточно хорошо тестировал на компьютере B, поэтому столкнулся с проблемой с версией подушки 3.0.0. Поэтому я опустился до версии 1.7.8. Это решает эту единственную проблему, ошибка дает мне еще одну:

File "/home/kramer65/theproject/app/models/FilterResult.py", line 26, in to_json
    self.image.save(b, 'JPEG')
  File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 1437, in save
    save_handler(self, fp, filename)
  File "/usr/local/lib/python2.7/dist-packages/PIL/JpegImagePlugin.py", line 471, in _save
    ImageFile._save(im, fp, [("jpeg", (0,0)+im.size, 0, rawmode)])
  File "/usr/local/lib/python2.7/dist-packages/PIL/ImageFile.py", line 476, in _save
    fh = fp.fileno()
UnsupportedOperation: fileno

И вот я как бы потерялся. Насколько я знаю, это проблема самой подушки, поэтому я не знаю, почему она работала и почему она больше не работает.

Я искал в Интернете, но я не мог найти никакого решения.

Кто-нибудь знает, что я мог сделать, чтобы решить это?

пс. PIL не установлен, поэтому это не столкновение между PIL и подушкой

[РЕДАКТИРОВАТЬ]

Я только что проверил import Image в Python (что предполагает, что PIL все еще установлен). К моему удивлению, это удается, хотя pip сообщает, что он не установлен:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Image
>>> exit()
$ sudo pip uninstall PIL
The directory '/home/hielke/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Cannot uninstall requirement PIL, not installed

2 ответа

Решение

Мне наконец-то удалось все исправить. Причина, по которой я опустил подушку с 3.0.0 до 1.7.8, заключается в том, что те, где только две версии, которые я видел, перечислены в индексе пакета Pillow Pypi. Я наконец-то вспомнил, что у меня был еще один сервер, на котором я когда-то тестировал этот код, и он все еще работал. Быстрый pip freeze сказал мне, что это была версия подушки 2.3.0 установлены. Так что после установки этого на моем dev-сервере все снова заработало прекрасно.

Так что я узнал из этого? использование pip freeze!

BytesIO объекты поднимают UnsupportedOperation (скорее, чем AttributeError который StringIO делает) когда их fileno Метод вызывается, чтобы исключение не было обработано так, как должно быть.

Это исправлено в Pillow 3.0.0 с помощью этого коммита https://github.com/python-pillow/Pillow/commit/197885164b22f82653af514e66c76f4b778c0b1b путем перехвата исключения. Следующее исправление. Остальная часть этого коммита - это изменения в наборе тестов.

В PIL/ImageFile.py:

 @@ -29,6 +29,7 @@

 import Image
 import traceback, os
+import io

 MAXBLOCK = 65536

 @@ -475,7 +476,7 @@ def _save(im, fp, tile):
     try:
         fh = fp.fileno()
         fp.flush()
-    except AttributeError:
+    except (AttributeError, io.UnsupportedOperation):
         # compress to Python file-compatible object
         for e, b, o, a in tile:
             e = Image._getencoder(im.mode, e, a, im.encoderconfig)

Вы можете просто пропатчить 1.7.8 для обработки исключения.

Другие вопросы по тегам