Python中关于import的问题如何解决?
在用 PIL 的时候,需要这样 import:
from PIL import Image
im = Image()
但是为什么不能:
import PIL
im = PIL.Image()
查了一些资料,都解释的不太清楚。有谁能分享一下如何理解吗?
Python中关于import的问题如何解决?
难道不是 import Image?
Pillow?
PIL 是一个目录(包),它不是一个类或者方法,所以不存在 PIL.Image()这个东西
在Python里,import 出问题多半是路径没找对或者命名冲突。核心就两点:让解释器能找到你的模块,以及避免名字重复。
1. 模块找不到 (ModuleNotFoundError)
这最常见。Python根据 sys.path 里的目录列表来搜索模块。如果你的模块不在这些地方,就报错。
import sys
print(sys.path) # 看看Python都去哪找
# 如果找不到,就把你模块所在的目录加进去
sys.path.append('/path/to/your/module')
import your_module
更规范的做法是用包结构,或者设置 PYTHONPATH 环境变量。
2. 循环导入 (Circular Import) 就是A模块要导入B,B模块又要导入A,卡住了。重构代码结构是根本,比如把公共部分抽到第三个模块。临时解决可以尝试在函数内部导入:
# 在需要的时候才导入,而不是在模块顶部
def some_function():
from module_a import something
# 使用 something
3. 命名冲突
比如你有个文件叫 string.py,然后 import string,Python可能导入了你自己的文件而不是标准库。解决办法就是别用Python标准库或流行包的名字给你的模块/文件起名。
4. 导入包里的模块 对于包结构,要用点号。假设结构如下:
my_package/
__init__.py
module_a.py
导入应该这样写:
from my_package import module_a
# 或者
import my_package.module_a
总结建议:理清模块路径和依赖关系是关键。
你知道__future__不,通常 2 的版本会有 import print_function. 和这个一样,你需要具体到特定的函数,直接 import PIL 结果是什么也不引入。
https://github.com/python-pillow/Pillow/blob/master/PIL/init.py
看看它的__init__.py 文件吧。
它那里并没有帮你导入 Image,所以需要 from xxx import xxx 这样导入。
#3,确实如你所说,Python在导入的时候是根据<a target="_blank" href="http://__init__.py" rel="nofollow noopener">__init__.py</a>来决定哪些模块是导入包的时候就导入的。感谢。
> 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.
Python 的 package 相当于一个名字空间(一种特殊的 module 类型),import package 会调用 import() 搜索到该 package 然后执行下面的 init.py ,将最后得到的对象和一个名字绑定在一起。也就是你得到的 PIL。所以你得到的这个对象并没有 Image。
但是我觉得<br>from PIL import Image<br>import PIL<br><br>im = PIL.Image.open("xxx")<br>
就没有问题了。具体看一下文档 https://docs.python.org/3/reference/import.html#packages 应该就没什么疑问了。
import PIL.Image
awesome

