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
相关产品推荐
相关产品推荐

