相对导入和绝对导入1
├── main.py
├── package1
├── package2
│ ├── m1.py
│ └── package4
│ ├── __pycache__
│ │ └── m2.cpython-38.pyc
│ └── m2.py
└── package3
__package__
的取值与可执行文件的位置有关(这里是main.py), 顶级包的位置只会到可执行文件那一层
如 m2.py:
print(__package__)
main.py
import package2.package4.m2
package2.package4
如果把可执行文件main.py移到父级demo那一层:
那么此时要查看m2.py的package,需要修改 main.py
:
import demo.package2.package4.m2
demo.package2.package4
如果把main.py移到package2下,则顶级包又变成了package4
一句话,package的位置从可执行位置开始找
绝对引入
绝对引入需从顶级包开始,如上面的例子都是绝对导入
难点: 你必须明白顶级包从哪开始算
相对引入
. .. ... .... .....
- 一个
.
表当前目录 - 两个
.
表上级目录 - 三个
.
表上上级目录 - 四个
.
表上上上级目录 ...
没有上限
需要注意的是相对引入不能放在用在入口文件中
如: 下面的写法就是错误的
import .package2.package4.m2
.
├── main.py
├── package1
├── package2
│ ├── __pycache__
│ │ └── m1.cpython-38.pyc
│ ├── m1.py
│ └── package4
│ ├── __pycache__
│ │ ├── m2.cpython-38.pyc
│ │ └── m3.cpython-38.pyc
│ ├── m2.py
│ └── m3.py
└── package3
m2.py
from .m3 import m
from ..m1 import m
print("----------这是m2.py的代码 start----------")
m=2
print(__package__)
print("----------这是m2.py的代码 end----------")
m3.py
print("----------这是m3.py的代码 start----------")
m=3
print(__package__)
print("----------这是m3.py的代码 end----------")
m1.py
print("----------这是m1.py的代码 start----------")
m=1
print(__package__)
print("----------这是m1.py的代码 end----------")
main.py
from package2.package4.m2 import m
print(m)
run main.py :
package2.package4
----------这是m2.py的代码 start----------
package2.package4
----------这是m2.py的代码 end----------
2
➜ demo /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/scottxiong/Desktop/end/python/demo/main.py
----------这是m3.py的代码 start----------
package2.package4
----------这是m3.py的代码 end----------
----------这是m2.py的代码 start----------
package2.package4
----------这是m2.py的代码 end----------
2
➜ demo /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/scottxiong/Desktop/end/python/demo/main.py
----------这是m3.py的代码 start----------
package2.package4
----------这是m3.py的代码 end----------
----------这是m1.py的代码 start----------
package2
----------这是m1.py的代码 end----------
----------这是m2.py的代码 start----------
package2.package4
----------这是m2.py的代码 end----------
2
➜ demo /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/scottxiong/Desktop/end/python/demo/main.py
----------这是m3.py的代码 start----------
package2.package4
----------这是m3.py的代码 end----------
----------这是m1.py的代码 start----------
package2
----------这是m1.py的代码 end----------
----------这是m2.py的代码 start----------
package2.package4
----------这是m2.py的代码 end----------
2