You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:15:01