首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“导入PIL;PIL.Image”不起作用,而“从PIL导入图像”起作用?

为什么“导入PIL;PIL.Image”不起作用,而“从PIL导入图像”起作用?
EN

Stack Overflow用户
提问于 2017-11-16 19:58:18
回答 2查看 1.2K关注 0票数 2

在python解释器中:

代码语言:javascript
复制
>>> 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'>

为什么我必须将导入设置为"from PIL import Image"?我对这两个问题都很感兴趣:“python导入中的底层工作是什么使得这种行为成为可能?”和“为什么PIL包被设计成这样工作?”

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

代码语言:javascript
复制
>>> import PIL
>>> from PIL import Image
>>> del Image

还是有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2017-11-16 20:05:42

您可以导入PIL.Image

代码语言:javascript
复制
import PIL.Image
PIL.Image.open('my_pic.jpg')

我认为Pillow之所以是这种结构,是因为它的历史。最初的包PIL允许您执行import Image。Pillow是支持Python3的PIL的分支,它将Image移到了PIL名称空间。建议的导入from PIL import Image使得从PIL切换到Pillow变得很容易。有关更多信息,请参阅porting docs

票数 3
EN

Stack Overflow用户

发布于 2017-11-16 20:55:44

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

代码语言:javascript
复制
import PIL

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

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

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

因此,尽管在导入和加载子模块之后,

代码语言:javascript
复制
import PIL
from PIL import Image

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

此外,我在任何地方都找不到这一点,但从我测试的情况来看,似乎当您导入一个子模块时,如下所示:

代码语言:javascript
复制
import package.submodule

或者:

代码语言:javascript
复制
from package import submodule

父包也会加载到进程中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47329105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档