在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
还是有更好的方法吗?
答案 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.Image
是PIL
的子模块,因此不会自动导入,
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
在此过程中也会加载父包。