Python开发包时包内模块互相引用导入报错如何解决?
Python包内同级模块导入异常问题及解决方案
问题场景
尝试构建包含可互相导入模块的Python包时,出现跨场景导入异常问题,对应目录结构如下:
- 包目录
testpack,包含三个文件:test1.py、test2.py、空内容的__init__.py testpack的父目录下存放入口文件main.py
各文件初始内容如下:
# test1.py def demo(): print("123") return
# test2.py import test1 def demo2(): print("test 2") test1.demo() if __name__=="__main__": demo2()
# main.py import testpack.test1 import testpack.test2 testpack.test2.demo2()
异常表现
- 直接单独运行
test2.py,输出符合预期:
test 2 123
- 运行父目录下的
main.py时报错,错误栈如下:
Traceback (most recent call last): File "E:/packages/main.py", line 2, in <module> import testpack.test2 File "E:\packages\testpack\test2.py", line 1, in <module> import test1 ModuleNotFoundError: No module named 'test1'
即使修改main.py为如下写法,报错仍然存在:
# main.py 替代版本 from testpack.test2 import demo2 demo2()
原因及解决方案
问题原因
Python的导入路径解析逻辑会根据运行入口的位置动态调整,单独运行test2.py时,Python会将test2.py所在目录加入模块搜索路径,因此可以直接找到同目录下的test1;当从父目录的main.py作为入口运行时,模块搜索路径的根目录是main.py所在目录,test2.py中直接写import test1会尝试从根目录搜索test1模块,自然无法找到。
修复方法
将test2.py中的import test1替换为from . import test1即可。
语法规则:包内导入时,前缀.表示导入当前文件同级目录下的模块,..表示导入父目录下的模块,以此类推。
内容的提问来源于stack exchange,提问作者Mpicukar
相关产品推荐
相关产品推荐

