48

我正在使用python2.6,今天早上遇到了问题。它说“模块”没有属性“图像”。这是我的输入。为什么我第一次不能使用 PIL.Image?

>>> import PIL
>>> PIL.Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'Image'
>>> from PIL import Image
>>> Image
<module 'PIL.Image' from '/usr/lib/python2.6/dist-packages/PIL/Image.pyc'>
>>> PIL.Image
<module 'PIL.Image' from '/usr/lib/python2.6/dist-packages/PIL/Image.pyc'>
4

3 回答 3

72

PIL__init__.py只是一个常见的空存根。它本身不会神奇地导入任何东西。

当你这样做时from PIL import Image,它会在 PIL 包中查找并找到文件 Image.py 并将其导入。当你这样做时,PIL.Image你实际上是在 PIL 模块上进行属性查找(这只是一个空存根,除非你明确地导入东西)。

实际上,导入模块通常不会导入子模块。os.path是一个著名的例外,因为 os 模块很神奇。

更多信息:
图像模块

于 2012-08-11T02:59:38.960 回答
12

如果您像我一样发现接受的答案有点令人困惑,因为您可以发誓您已经能够使用

import PIL
PIL.Image

有时在此之前,一个潜在的原因是,如果您的 Python 会话中的任何from PIL import Image其他代码已经运行,或者import PIL.Image即使它在完全不同的范围内,您也可以访问PIL.Image.

特别是matplotlib在导入时会这样做。所以如果你跑

import matplotlib
import PIL
PIL.Image

它有效。谢谢,蟒蛇。

不要相信任何人。不要相信 Python。使用import PIL.Image.

于 2021-09-09T23:39:17.540 回答
8

你可以做:

try:
    import Image
except ImportError:
    from PIL import Image

最好用枕头代替 PIL。

于 2014-07-11T06:32:22.160 回答