即便存在__init__.py仍无法跨目录导入Python文件如何解决
Python导包提示No module named 'utils'解决方案
问题根因与对应解决方案
1. 包标识文件命名错误
你当前utils文件夹下的初始化文件命名为__init_.py,不符合Python规范,正确命名应为前后各2个下划线的__init__.py。该文件是Python将文件夹识别为可导入包的必要标识,修改文件名后可解决第一类识别问题。
2. 模块搜索路径未包含utils父目录
Python导入包时仅会查找sys.path列表中收录的路径,若utils文件夹的父目录不在该列表中就会触发找不到模块的报错,可通过以下任意一种方式解决:
- 临时添加路径到sys.path
在你调用utils的业务脚本最开头添加如下代码,手动将utils所在的父目录加入搜索路径:
import sys import os # 假设你的业务脚本存放在 项目根目录/业务文件夹/xxx.py,utils存放在项目根目录/utils # 以下代码会自动计算项目根目录的绝对路径并加入搜索列表 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
如果你的目录层级不同,调整os.path.dirname的调用次数即可,最终要保证加入的路径是utils文件夹所在的上一级目录。
- 以模块方式运行脚本
进入项目根目录(也就是utils文件夹所在的目录),执行命令时使用-m参数指定模块路径,例如你的业务脚本存放在test/run.py,则执行:python -m test.run
该运行方式会自动将当前工作目录加入sys.path,可直接识别utils包。 - 全局安装工具包
如果该utils是通用工具,可将其移动到Python的site-packages目录下,所有Python脚本都可以直接导入使用。
额外注意事项
你报错信息中显示当前运行的文件名为readData.py,和你要导入的utils下的readData.py重名,会导致导入冲突,建议修改业务脚本的文件名,避免和依赖模块重名。
另外你当前的业务代码仅创建了ProcessJsonFile的实例,没有调用读取方法,如果需要输出json内容可以修改为:
from utils import readData def execute(): processor = readData.ProcessJsonFile("test.json") processor.readFileData() if __name__ == "__main__": execute()
内容的提问来源于stack exchange,提问作者Bob786
相关产品推荐
相关产品推荐

