Python多目录项目下同目录与跨目录模块导入报错问题咨询
问题成因
Python导入模块时会优先从sys.path记录的路径中查找目标模块,sys.path默认会包含入口脚本所在的目录,也就是你运行main.py时,项目根目录code会被加入sys.path,但core目录不会被自动加入。
你在test1.py中直接写import test2时,Python只会遍历sys.path下的路径找名为test2的模块,不会自动去test1.py自身所在的core目录查找,因此会抛出模块不存在的错误。
小提示:Python 3.3以下版本需要在
core、database目录下各新建一个空的__init__.py文件,标识目录为Python包,才能正常执行包导入操作。
解决方法
1. test1.py导入同目录test2.py的两种方案
- 绝对导入(兼容性更好,推荐使用):
基于sys.path中已有的项目根目录,从顶层包路径导入:from core import test2 - 相对导入(仅适合作为包模块运行,不可单独直接执行test1.py):
用.表示当前同级目录:from . import test2
2. test1.py导入database目录下sample.py的两种方案
- 绝对导入(推荐使用):
同样基于顶层的code目录路径导入:from database import sample - 相对导入:
用..表示当前目录的上一级(即code目录),再定位到database包:from ..database import sample
额外兼容方案
如果你需要单独执行test1.py也能正常导入,可以在test1.py最开头手动把项目根目录加入sys.path:
import sys from pathlib import Path # __file__是test1.py的路径,parent.parent就是上层的code目录 sys.path.append(str(Path(__file__).parent.parent.resolve()))
添加这段代码后,你原先写的import test2也能正常运行,导入sample直接写import database.sample即可。
内容的提问来源于stack exchange,提问作者Saranraj K
相关产品推荐
相关产品推荐

