关于 Python 中的 import 调用模块,不知道有没有同学跟我一样遭遇过同样的“坑”。前一段时间看代码的时候就遇到过这个问题,但是懒得整理,今天恰巧又碰到了同样的问题。
包和模块
什么是包?你在主目录下面创建了一个文件夹,此时这个文件夹能不能称为一个包?答案是不能的。需要在该目录下面添加一个 _init_.py 的文件才行。
包中存放的是什么?是模块。那么什么又是模块呢?
模块就是以 .py 为结尾的文件。
通过模块和包的共同作用,你就可以调取目标包中的目标模块,今儿可以应用目标模块中的函数、类等。
import的两种格式
import XX
from YY import XX
第一种格式XX必须是模块的名称(即 XX.py)
第二种就不同了,YY可以是包的名称,此时XX是模块的名称;YY是模块的名称,此时XX是类、函数的名称等。
这两者后面都可以接 as
问题
import遇到的问题无非就是,主目录下的文件引用主目录下子目录下的子文件;子目录下子文件之间的相互引用;子文件1下的文件引用子目录2下的文件。不知道我说明白没有,看图吧。
--home
--son1
s1_1.py
s1_2.py
--grandson1
gs1.py
--grandson2
gs2.py
gs3.py
--son2
s2_1.py
s2_2.py
h1.py
h2.py
sys.path 用于查找 import查找模块的地方。注意,不要再pycharm中操作,会有一些不同。
h1调用h2:
import h2
h1调用s1_1.py
from son1 import s1_1
注意一定要在目录中添加 __init__.py 文件
s1_1调用s1_2.py
from son1 import s1_2
from . import s1_2
这里就产生差异了,首先,当运行 python s1_1.py时候就产生报错了,怎么解决?
使用 Python -m son1.s1_1 两个注意的点个,第一,这个命令是在Home目录下面输入的,第二是 son1.s1_1 没有 .py 结尾,也不是/。测试应用上面两个都可以。这是在终端上运行。
如果你在Pycharm中运行的话
绝对路径的情况下,你可以直接运行s1_1.py文件,而相对路径则不行。
s1_1调用s2_1.py
from son2 import s2_1
这就不涉及到相对路径了,在Pycharm中同样可以直接运行
s1_1调用h1.py
import h1
同样pycharm中可以直接运行,终端中需要 -m
gs1调用s1_1
from son1 import s1_1
gs1调用gs2,gs2,s2_1,h1
from son1.grandson2 import gs2
from ..grandson2 import gs2
from . import gs3
from son2 import s2_1
import h1
总而言之,主目录下面的文件可以直接调用 import h1,
同级子目录之间需要 from .yy import
同目录下 from . import
所在的目录在同级目录下 from yy import
一般运行子目录中的文件都需要加 -m 如果子目录调用了其他的文件