Python OOP跨文件导入类报错:AttributeError问题排查
我来帮你拆解下这个导入问题哈!
首先,咱们先定位核心问题:你在temp文件夹里直接运行unittest.py时,用了import temp.aaaa的导入方式,但此时Python的模块搜索路径并没有包含上层的Project目录,导致它找不到temp这个包,自然也就无法识别temp.aaaa了。
具体原因拆解
先再明确下你的项目结构:
->Project: --> temp: ---> extr(folder) ---> __init__.py ---> aaaa.py ---> unittest.py ---> test.txt
当你直接在temp文件夹内执行python unittest.py时,Python会把当前的temp文件夹路径加入到sys.path(模块搜索路径)中。这时候你写import temp.aaaa,Python会去sys.path里找名为temp的模块,但sys.path里的temp是当前目录,不是一个可被导入的上层包,所以就抛出了AttributeError: module 'temp' has no attribute 'aaaa'的错误。
两种可行的解决方案
方案一:直接导入同目录模块(适合在temp文件夹内直接运行脚本)
既然aaaa.py和unittest.py在同一个目录下,直接导入aaaa即可,修改unittest.py代码如下:
import aaaa y = aaaa.Test()
保存后直接运行,就能正常实例化Test类了。
方案二:以包的形式运行(适合从Project目录启动)
如果你想保留import temp.aaaa的写法,需要从Project目录下,以模块的方式运行unittest.py:
- 保持
unittest.py代码不变:
import temp.aaaa y = temp.aaaa.Test()
- 打开终端,切换到
Project目录,执行以下命令:
python -m temp.unittest
这种方式下,Python会把Project目录加入sys.path,temp会被识别为合法的包,就能正确导入temp.aaaa了。
另外补充小提示:如果想用相对导入(比如from . import aaaa),只能在把脚本作为包的一部分运行时使用,直接运行脚本会报错,所以不太推荐给刚接触模块导入的同学~
内容的提问来源于stack exchange,提问作者pyton17

