关于 Python 的 import 问题

2017-10-10 22:50:03 +08:00
 TenTo
在用 PIL 的时候,需要这样 import:
from PIL import Image
im = Image()

但是为什么不能:
import PIL
im = PIL.Image()

查了一些资料,都解释的不太清楚。有谁能分享一下如何理解吗?
2451 次点击
所在节点    Python
8 条回复
264768502
2017-10-10 23:11:47 +08:00
难道不是 import Image?

Pillow?
PIL 是一个目录(包),它不是一个类或者方法,所以不存在 PIL.Image()这个东西
stebest
2017-10-10 23:21:55 +08:00
你知道__future__不,通常 2 的版本会有 import print_function. 和这个一样,你需要具体到特定的函数,直接 import PIL 结果是什么也不引入。
keysona
2017-10-10 23:23:49 +08:00
https://github.com/python-pillow/Pillow/blob/master/PIL/__init__.py

看看它的__init__.py 文件吧。

它那里并没有帮你导入 Image,所以需要 from xxx import xxx 这样导入。
TenTo
2017-10-11 05:21:15 +08:00
@keysona #3,确实如你所说,`Python`在导入的时候是根据`__init__.py`来决定哪些模块是导入包的时候就导入的。感谢。
Morriaty
2017-10-11 09:56:24 +08:00
> when you import a package, only variables/functions/classes in the __init__.py file of that package are directly visible, not sub-packages or modules.
scriptB0y
2017-10-11 10:19:02 +08:00
Python 的 package 相当于一个名字空间(一种特殊的 module 类型),import package 会调用 __import__() 搜索到该 package 然后执行下面的 __init__.py ,将最后得到的对象和一个名字绑定在一起。也就是你得到的 PIL。所以你得到的这个对象并没有 Image。

但是我觉得

```
from PIL import Image
import PIL

im = PIL.Image.open("xxx")
```

就没有问题了。具体看一下文档 https://docs.python.org/3/reference/import.html#packages 应该就没什么疑问了。
yangtukun1412
2017-10-11 11:41:31 +08:00
import PIL.Image
Tianny
2017-10-12 20:36:58 +08:00
@Morriaty awesome

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX