相对导入和绝对导入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

results matching ""

    No results matching ""