UnsupportedOperation: fileno - 如何修复这个 Python 依赖混乱?
UnsupportedOperation: fileno - How to fix this Python dependency mess?
我正在构建一个相当广泛的 Python 后端,并且在服务器 A 上运行良好。然后我将系统安装在一个新的(开发)服务器 B 上,我只是再次在该服务器上安装了所有 pip 包从头开始。事情似乎工作正常,所以我做了 pip freeze
。然后,我获取了该列表并升级了服务器 A 上的软件包。
但是,正如您所料,我应该更清楚。我在机器 B 上测试得不够好,所以我 运行 遇到了 Pillow 版本 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
我有点迷路了。据我所知,这是 Pillow 本身的一个问题,所以我不知道为什么它以前可以工作,为什么它不再工作了。
我在网上搜索了一圈,没有找到任何解决办法。
有人知道我能做些什么来解决这个问题吗?
ps。 PIL 没有安装,所以不是 PIL 和 Pillow 之间的碰撞
[编辑]
我刚刚在 Python 中测试了一个 import Image
(这表明 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
BytesIO
对象在调用 fileno
方法时引发 UnsupportedOperation
(而不是 AttributeError
,StringIO
会引发异常)应该是。
此提交 https://github.com/python-pillow/Pillow/commit/197885164b22f82653af514e66c76f4b778c0b1b 通过捕获异常在 Pillow 3.0.0 中修复了此问题。以下是修复。该提交的其余部分是对测试套件的更改。
在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 来处理异常。
我终于设法解决了问题。我将 pillow 从 3.0.0 降级到 1.7.8 的原因是因为我在 Pillow Pypi package index 上看到的仅有的两个版本。我终于想起我还有一台服务器,我曾经在上面测试过这段代码,而且它还在工作。快速 pip freeze
告诉我它安装了 Pillow 版本 2.3.0
。因此,在我的开发服务器上安装它之后,一切又恢复正常了。
那么我从中学到了什么?使用 pip freeze
!
我正在构建一个相当广泛的 Python 后端,并且在服务器 A 上运行良好。然后我将系统安装在一个新的(开发)服务器 B 上,我只是再次在该服务器上安装了所有 pip 包从头开始。事情似乎工作正常,所以我做了 pip freeze
。然后,我获取了该列表并升级了服务器 A 上的软件包。
但是,正如您所料,我应该更清楚。我在机器 B 上测试得不够好,所以我 运行 遇到了 Pillow 版本 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
我有点迷路了。据我所知,这是 Pillow 本身的一个问题,所以我不知道为什么它以前可以工作,为什么它不再工作了。
我在网上搜索了一圈,没有找到任何解决办法。
有人知道我能做些什么来解决这个问题吗?
ps。 PIL 没有安装,所以不是 PIL 和 Pillow 之间的碰撞
[编辑]
我刚刚在 Python 中测试了一个 import Image
(这表明 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
BytesIO
对象在调用 fileno
方法时引发 UnsupportedOperation
(而不是 AttributeError
,StringIO
会引发异常)应该是。
此提交 https://github.com/python-pillow/Pillow/commit/197885164b22f82653af514e66c76f4b778c0b1b 通过捕获异常在 Pillow 3.0.0 中修复了此问题。以下是修复。该提交的其余部分是对测试套件的更改。
在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 来处理异常。
我终于设法解决了问题。我将 pillow 从 3.0.0 降级到 1.7.8 的原因是因为我在 Pillow Pypi package index 上看到的仅有的两个版本。我终于想起我还有一台服务器,我曾经在上面测试过这段代码,而且它还在工作。快速 pip freeze
告诉我它安装了 Pillow 版本 2.3.0
。因此,在我的开发服务器上安装它之后,一切又恢复正常了。
那么我从中学到了什么?使用 pip freeze
!