使用sys.path.apped时,添加相对地址时,起始地址不是当前调用脚本或者模块的所在地址,而是当前的工作地址,比如命令为 ~/Documents/python/test$ python package/package1/module1_1.py
,当前工作地址为~/Documents/python/test
,在module1_1.py文件中添加了相对路径".",这个路径就是~/Documents/python/test
,而不是module1_1.py所在的地址
import sys
import os
print(__name__)
sys.path.append(".")
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR)
sys.path.append(BASE_DIR)
from package.package2 import module2_
test
├── main.py
└── package
├── package1
│ ├── init.py
│ ├── module1_1.py
│ ├── module1_2.py
│ ├── package1_1
│ │ ├── module1_1_1.py
│ │ └── pycache
│ │ └── module1_1_1.cpython-37.pyc
│ └── pycache
│ ├── init.cpython-37.pyc
│ ├── module1_1.cpython-37.pyc
│ └── module1_2.cpython-37.pyc
├── package2
│ ├── init.py
│ ├── module2_1.py
│ └── pycache
│ ├── init.cpython-37.pyc
│ └── module2_1.cpython-37.pyc
└── test.py
test.py内容如下
from package1 import module1_1
module1_1.py内容如下
import sys
import os
print(__name__)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
print(BASE_DIR)
sys.path.append(BASE_DIR)
# from ..package2 import module2_1 #导入错误
from package.package2 import module2_1 #导入正确
BASE_DIR为/home/leo/Documents/python/test
,此时因为package在test目录下面,可以使用绝对导入,但是无法使用相对导入,因为modul1_1.py这个模块的顶层目录为package1,无法继续向上一级,也就是无法使用…来相对导入 模块的顶层目录为被导入时的最上层地址,在test.py文件中有定义
module2_1.py中代码如下,此时该模块的顶层目录为在module1_1.py中定义的package,所以可以使用向上一级的相对导入
from ..package1.package1_1 import module1_1_1 #导入正确
总结一句话,能否使用…这种相对导入,需要看这个模块被导入时的形式