python import机制深入研究

使用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 #导入正确

总结一句话,能否使用…这种相对导入,需要看这个模块被导入时的形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值