import PIL与from PIL import Image的区别是什么?
问题核心原因
这是Python不同包的顶层导出规则差异导致的,和Python导入规则不冲突:
datetime是标准库的模块,import datetime导入的datetime模块本身内部就定义了datetime类,所以可以直接通过datetime.datetime访问类成员。- PIL(Pillow)是多文件组成的Python包,它的顶层
__init__.py默认没有主动导入Image子模块,所以直接执行import PIL时,PIL的命名空间里不会自动包含Image属性,自然会报AttributeError。
可用的两种正确写法
- 写法1(你已经验证可行,修正了原示例的语法错误):
from PIL import Image batman = Image.open("image.jpg") batmobile, batplane = batman.size print(batmobile,"x",batplane)
- 写法2:显式导入PIL下的Image子模块,也可以用你最开始的调用形式:
import PIL.Image batman = PIL.Image.open("image.jpg") batmobile, batplane = batman.size print(batmobile,"x",batplane)
补充:你修改后的示例代码存在语法错误,
Image.open后缺少左括号,正确写法是Image.open("image.jpg")
原理验证
你可以自己构造简单包验证这个逻辑:
- 新建名为
test_pkg的文件夹,创建两个文件:- 空内容的
__init__.py(包的标识文件) test_mod.py,内容为:
def say_hi(): print("hi") - 空内容的
- 在同级目录执行测试代码:
import test_pkg # 下面这行运行会报AttributeError,和你遇到的PIL问题完全一致 test_pkg.test_mod.say_hi() - 给
test_pkg/__init__.py添加一行from . import test_mod,再执行上面的测试代码就可以正常运行,这就是datetime包采用的导出逻辑。
内容的提问来源于stack exchange,提问作者user16074414
相关产品推荐
相关产品推荐

