为什么“导入PIL; PIL.Image”不起作用,但“来自PIL导入图像”呢?

时间:2017-11-16 11:58:18

标签: python python-imaging-library

在python解释器中:

>>> 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
>>> PIL.Image
<module 'PIL.Image' from '/usr/lib/python2.7/site-packages/PIL/Image.pyc'>

为什么我必须将导入设为“来自PIL导入图像”?我对“python导入的基础工作是什么使这种行为成为可能”感兴趣?并且“为什么PIL包被设计成像这样工作?”

另外,我真的很想在编程时保持一个干净的命名空间。如果我想在我的代码中使用PIL.Image,我应该像这样导入:

>>> import PIL
>>> from PIL import Image
>>> del Image

还是有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以导入PIL.Image

import PIL.Image
PIL.Image.open('my_pic.jpg')

我认为Pillow的结构是这样的,因为包装的历史。原始包PIL允许您执行import Image。 Pillow是支持Python 3的PIL的分支,它将Image移动到PIL命名空间。建议的导入from PIL import Image可以轻松地从PIL切换到Pillow。有关详细信息,请参阅porting docs

答案 1 :(得分:0)

PIL.ImagePIL的子模块,因此不会自动导入,

import PIL

因为Python不会递归导入子模块。

Python语言参考中的

5.4.2. Submodules可能有助于理解导入子模块的行为。

  

当使用任何机制加载子模块时,......绑定将放在父模块的命名空间中,并附加到子模块对象。

因此,虽然在导入和加载子模块后,

import PIL
from PIL import Image

您可以通过PIL.Image访问它,这并不意味着导入PIL.Image模块时会加载PIL

此外,我无法在任何地方找到明确说明,但从我测试的内容来看,似乎是在导入子模块时,如:

import package.submodule

或:

from package import submodule

在此过程中也会加载父包。