一直对python的import机制不是特别理解,直到最近又使用pillow,因为有段时间没用pillow了,所以没有按照官方docs里的方式,而是直接import了:

import PIL
PIL.Image 	#error
'''
Traceback (most recent call last):
  File "/tmp/piltest.py", line 2, in <module>
    im=PIL.Image.open("one.jpg")
AttributeError: module 'PIL' has no attribute 'Image'
'''

一开始以为是pillow的安装有问题,将/usr/lib/下的删除后,在/home下又装了一遍,发现还是不行。

查看__init__.py发现其几乎是个空文件,只定义了几个常量,没有其他内容,所以PIL.Image必然不存在,因为import不会自动导入.../PIL/*.py文件。

对python的import的机制总结如下:

  • import PILfrom PIL import * 效果(基本)一样,但是只会导入__init__.py文件中import的对象,不会自动递归import子模块
  • from PIL import Image导入指定的.../PIL/Image.py(第一种方式不会自动导入子模块)。
  • from PIL import VERSION导入指定的__init__.py中的VERSION对象(第一种方式会自动导入)。