You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类。

方案二:统一使用绝对导入

  1. 修改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)
  1. 运行lev0.py时,直接在project目录下执行python lev0.py即可(此时项目根目录默认在sys.path中)。

内容的提问来源于stack exchange,提问作者Allan Vestergaard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:35:26