Python包内模块导入兼容问题:适配__init__.py与lev0.py运行
Python模块导入问题解决方案
问题根源
直接运行subfolder/__init__.py时,Python会将当前文件所在目录(subfolder)加入sys.path,因此from lev2 import Lev2能找到同目录的文件;但从lev0.py导入subfolder时,sys.path指向项目根目录(project),此时__init__.py中的导入语句会去根目录查找lev2.py,自然找不到,从而触发No module named lev2错误。
调整方案
方案一:相对导入+兼容处理(推荐)
修改subfolder/__init__.py的导入逻辑,同时兼容两种运行场景:
# 优先使用相对导入适配外部导入场景,失败则降级为本地导入适配单独运行场景 try: from .lev2 import Lev2 except ImportError: from lev2 import Lev2 class Lev1: def __init__(self): self.name = "lev1" self.child = Lev2() if __name__ == "__main__": obj1 = Lev1() obj2 = Lev2() print(obj1.name, obj1.child.name)
修改后,无论是单独运行__init__.py,还是通过lev0.py导入subfolder,都能正确加载Lev2类。
方案二:统一使用绝对导入
- 修改
subfolder/__init__.py为绝对导入,并在单独运行时手动添加项目根目录到sys.path:
from subfolder.lev2 import Lev2 class Lev1: def __init__(self): self.name = "lev1" self.child = Lev2() if __name__ == "__main__": # 单独运行时,将项目根目录加入Python路径 import sys from pathlib import Path project_root = Path(__file__).parent.parent sys.path.append(str(project_root)) obj1 = Lev1() obj2 = Lev2() print(obj1.name, obj1.child.name)
- 运行
lev0.py时,直接在project目录下执行python lev0.py即可(此时项目根目录默认在sys.path中)。
内容的提问来源于stack exchange,提问作者Allan Vestergaard
相关产品推荐
相关产品推荐

