在python中,模块导入和编码都是比较重要的,这两种东西一定要花时间弄清楚,如果摸棱两可,每次出问题都靠猜,那是非常痛苦的。
今天主要讲讲多层目录之前相互导入的一些问题。
通常,相同层级目录模块导入非常好理解且也不容易出错。
├─module_a
│ a1.py
│ a2.py
│ __init__.py
# a1.py
print('a1')
导入a1模块,直接import a1导入即可。
# a2.py
import a1
print('a2')
运行结果:
a1
a2
下面看看多层目录。
│ main.py
│
├─module_a
│ a1.py
│ a2.py
│ __init__.py
# a1.py
print('a1')
# a2.py
import a1
print('a2')
# main.py
from module_a import a2
print('main')
猜猜运行main.py运行结果是什么?
正常我们会觉得是:
a1
a2
main
实际结果报错,说在a2.py中导入a1时,找不到 a1模块。
Traceback (most recent call last):
File "E:\QQ坚果云\模块导入\main.py", line 1, in <module>
from module_a import a2
File "E:\QQ坚果云\模块导入\module_a\a2.py", line 1, in <module>
import a1
ModuleNotFoundError: No module named 'a1'
这是怎么回事,前面同层运行都行,这里怎么就不行了呢?
下面我们改改a2中的导入:
修改前:
# a2.py
import a1
print('a2')
修改后:
# a2.py
from module_a import a1
print('a2')
此时如果运行 a2.py,会出现下面报错:
Traceback (most recent call last):
File "E:\QQ坚果云\模块导入\module_a\a2.py", line 1, in <module>
from module_a import a1
ModuleNotFoundError: No module named 'module_a'
这个很好理解,a1和a2本来就在一个目录下,直接从外层往里读,是无法读到的。
虽然运行a2.py报错,但是直接运行main.py ,发现居然可以了。
# main.py
from module_a import a2
print('main')
运行结果:
a1
a2
main
结论:
要理解上面的问题,核心就是要弄清楚项目的运行起点,运行那个程序,就以那个程序为运行起点。
如果需要跨包运行呢,既要main.py可以运行,又要a2.py可以运行呢?
只需要运行前添加路径即可。
# a2.py
import sys
sys.path.append('./module_a')
import a1
print('a2')
上面的测试,可能在有些编辑器会不一样,原因可能是你的编辑器会自动给你添加路径,建议直接shell中测试运行。
更多层级的包模块原理一样,具体实际做项目碰到库导入问题,大概率就是上面的问题没弄清楚。