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

Python包导入报错:运行test.py时提示找不到模块'a'

解决Python包导入时的ModuleNotFoundError问题

问题重现

你的目录结构如下:

Main_Directory/
    Package/
        __init__.py
        a.py(包含类a)
        b.py(包含类b)
        path.py
    test.py

__init__.py 代码:

print("IN init")
from a import a
from b import b
print("DONE")

test.py 代码:

print("IN TEST")
from Package import a
from Package import b

运行__init__.py时输出正常:IN INIT DONE;但运行test.py时,输出IN TEST IN INIT后就报错module not found 'a'。

原因分析

问题出在模块搜索路径的差异上:

  • 直接运行__init__.py时,Python的当前工作目录是Package/,所以from a import a会直接在当前目录找到a.py,自然没问题。
  • 运行test.py时,Python的当前工作目录是Main_Directory/,此时Package作为一个包被导入,__init__.py里的from a import a会让Python在Main_Directory/下找a.py,而非Package/目录下的,所以找不到目标模块。

解决方案

有两种简单可靠的解决方法:

方法1:使用相对导入

在__init__.py里用相对路径指定导入同目录下的模块,用.表示当前包目录:

print("IN init")
from .a import a
from .b import b
print("DONE")

这种方式明确告诉Python:从当前包(Package)内部导入a和b模块,不管外部运行环境的工作目录是什么,都能精准定位到目标文件。

方法2:使用绝对导入

基于包的全名来导入模块,让Python从Main_Directory/(当前工作目录)开始,定位到Package包下的模块:

print("IN init")
from Package.a import a
from Package.b import b
print("DONE")

这种方式也能生效,因为运行test.py时,Main_Directory已经在Python的模块搜索路径中。

额外提醒

尽量不要直接运行__init__.py文件,它的设计初衷是用来初始化Python包的,而非作为独立脚本执行。正常的使用方式就是像test.py这样从外部导入包来调用内部模块。

内容的提问来源于stack exchange,提问作者barkat khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:58