Flask应用Python模块组织及导入ModuleNotFoundError问题咨询
最优模块导入方案
问题根因
Python导入模块时会从sys.path记录的路径中搜索目标模块,你直接运行子目录内的.py文件时,当前工作目录是该子文件所在的文件夹,上层的Classes目录不在搜索路径里,就会抛出模块不存在的错误。你之前写的相对路径追加sys.path的方式不稳定,是因为相对路径是基于当前运行目录计算的,运行位置变化就会失效,同时反斜杠是Windows专属路径分隔符,部署到Linux服务器时天然不兼容。
落地步骤
1. 调整项目结构,统一启动入口
在Application文件夹的同级目录创建Flask全局启动文件app.py,同时给Application文件夹添加__init__.py标记为根包,调整后目录如下:
项目根目录 ├── app.py # Flask全局启动入口 └── Application ├── __init__.py # 标记Application为根包 ├── Interpreter │ ├── __init__.py │ └── parser.py ├── Classes │ ├── __init__.py │ ├── Interfaces │ │ ├── __init__.py │ │ └── Expressions.py │ ├── Operations │ │ ├── __init__.py │ │ ├── Arithmetic.py │ │ └── Operations.py │ └── SymbolTable │ ├── __init__.py │ ├── Symbol.py │ └── Symbol_table.py └── Driver.py
2. 统一导入写法
所有模块内的导入统一用根包前缀的绝对导入,比如你要在Operations.py中导入Expression类,写法调整为:
from Application.Classes.Interfaces.Expressions import Expression
小提示:注意核对文件名拼写,你示例中的导入写的是Expression,但实际文件名为Expressions.py,拼写不一致也会导致导入错误
如果是同目录下的文件导入,可以用更简洁的相对导入,比如Arithmetic.py导入同目录Operations.py的内容:
from .Operations import 目标类/方法
3. 统一运行方式
- 日常启动Flask服务时,永远在最外层的项目根目录执行启动命令:
flask run或者python app.py,此时Python会自动把项目根目录加入sys.path,所有导入都会正常生效 - 如果需要单独测试某个子模块的功能,用
-m参数以模块形式运行,比如测试Operations.py:python -m Application.Classes.Operations.Operations
这个方案完全不需要手动修改sys.path,本地开发和服务器部署逻辑完全一致,只要服务器上的运行路径为项目根目录就不会出现兼容问题。
内容的提问来源于stack exchange,提问作者Villa
相关产品推荐
相关产品推荐

