Python如何通过__init__.py导入同级包模块并解决引用报错
问题根因梳理
你碰到的报错主要由3类问题导致:
- 文件名/模块名拼写不统一
- 各层级
__init__.py的导入路径指向错误 - 相邻包的相对导入规则使用错误
修复步骤
1. 统一所有拼写
首先修正所有拼写不一致的低级错误:
main.py里的from utils import *改成from util import *,你的包名是util不是utilsdata/data_loader.py里的from util.stringUtils import StringUtil改成from util.stringUtil import StringUtil,你的文件名是stringUtil.py不是stringUtils.pydata/data_loader.py里的类定义漏了冒号:class DataLoader()改成class DataLoader():
2. 修正各层级__init__.py的导入逻辑
你之前的__init__.py导入的模块名不存在,按以下修改:
根目录src/__init__.py
不需要额外写导入内容,留空即可,只要文件存在就能标记src为Python可识别的包目录
data/__init__.py
要把data_loader.py里的类导出,修改为:
from .data_loader import DataLoader
如果要导出该文件所有内容可以写from .data_loader import *,显式声明导出的类更便于维护
util/__init__.py
要把stringUtil.py里的类导出,修改为:
from .stringUtil import StringUtil
3. 修正跨包导入的路径(可选,兼容不同运行方式)
如果你是直接在src目录下运行python main.py,data_loader.py里的导入可以保持from util.stringUtil import StringUtil;如果要更规范支持从项目根目录运行,也可以改成相对导入:
from ..util.stringUtil import StringUtil
4. 修正main.py的冗余代码
你写的def __init__()是无效代码,Python不会自动执行这个函数,直接写执行逻辑即可:
from data import * from util import * if __name__ == "__main__": print(StringUtil.substringRight("Hello world!", "l")) loader = DataLoader("C:/SOME/PATH/")
验证运行
进入src目录,执行python main.py即可正常运行,不需要额外修改sys.path,所有类都可以正常识别。
内容的提问来源于stack exchange,提问作者Mc Midas
相关产品推荐
相关产品推荐

