跨目录导入模块问题:无法将models.py导入至__init__.py
解决Flask项目中models模块导入失败问题
目录结构
Backend ├── Flaskr │ └── __init__.py └── models.py
问题描述
需要在Flaskr/__init__.py中导入models.py里的setup_db和Book,尝试了以下两种导入语句:
from models import setup_db, Bookfrom backend.models import setup_db, Book
但分别触发以下错误:
from models import setup_db, Book
ModuleNotFoundError: No module named 'models'
或者:
from backend.models import setup_db, Book
ModuleNotFoundError: No module named 'backend'
错误原因
- 第一种导入失败:
__init__.py位于Flaskr目录下,Python默认仅搜索当前文件所在目录及sys.path中的路径,models.py在上级Backend目录,不在搜索范围内,因此无法找到。 - 第二种导入失败:
Backend目录未被识别为Python包(缺少__init__.py文件),或运行环境的sys.path未包含Backend的父目录,导致Python找不到backend模块。
解决方案
方案1:使用相对导入
在Flaskr/__init__.py中用相对路径指定上级目录:
from ..models import setup_db, Book
注意:这种方式要求Backend被当作Python包使用,不能直接运行__init__.py,需从Backend目录外部启动项目(比如在Backend的父目录下执行flask run)。
方案2:手动添加路径到sys.path
在Flaskr/__init__.py开头加入代码,将Backend目录加入Python搜索路径:
import sys import os # 获取Backend目录的绝对路径 backend_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if backend_dir not in sys.path: sys.path.append(backend_dir) # 此时可正常导入 from models import setup_db, Book
方案3:将Backend设为Python包
在Backend目录下创建空的__init__.py文件,目录结构变为:
Backend ├── __init__.py ├── Flaskr │ └── __init__.py └── models.py
之后即可使用from backend.models import setup_db, Book导入,同时要确保Backend的父目录在sys.path中,或从该父目录启动项目。
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

