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 для обработки исключения.