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

跨包导入模块报错:在app2中导入app1的Flask实例失败

解决跨包导入Flask App的问题

我来帮你搞定这个导入报错的问题!先理清楚你的项目结构(修正了明显的拼写错误):

project/
├── app1/
│   ├── __init__.py
│   ├── views.py
│   └── helper.py
└── app2/
    ├── __init__.py  # 注意:你原来写的是__init.py,少了下划线,这会导致app2无法被识别为Python包,先修正这个!
    └── file2.py

为什么app1里能导入,app2里不行?

当你在app1.helper里执行from app1 import app时,Python的sys.path里已经包含了project/目录(要么是因为你在project目录下运行脚本,要么是Flask自动帮你添加了路径),所以能找到app1这个包。但直接运行app2/file2.py时,Python会把app2/目录作为sys.path的第一个元素,根本找不到同级的app1包,哪怕手动加sys.path.append如果路径不对也没用。

具体解决方案

方法一:动态添加项目根目录到sys.path(推荐,适合直接运行脚本)

在app2/file2.py的最开头加入这段代码,动态定位项目根目录并添加到路径中,避免硬编码路径的问题:

import sys
from pathlib import Path

# 获取项目根目录的绝对路径(当前文件的父目录的父目录)
project_root = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(project_root))

# 现在可以正常导入了
from app1 import app

方法二:用模块方式运行脚本+相对导入

如果你不想修改代码里的路径,可以用Python的模块运行方式,同时配合相对导入:

  1. 确保你在project/目录下打开终端
  2. 修改app2/file2.py的导入语句为相对导入:
from ..app1 import app
  1. 运行脚本时用模块方式启动:
python -m app2.file2

这种方式下Python会自动把project/目录加入sys.path,相对导入就能正常工作。

额外建议:统一项目入口

更规范的做法是在项目根目录下创建一个入口文件run.py,这样所有模块的导入路径都会统一:

# project/run.py
from app1 import app

if __name__ == "__main__":
    app.run(debug=True)

之后你只需要在project/目录下运行python run.py启动Flask,其他模块(包括app2/file2.py)里的导入都会自动识别到正确的路径。

内容的提问来源于stack exchange,提问作者user7422128

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:42:20