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

解决Python ValueError: 在非包中尝试相对导入的问题

解决Flask项目中相对导入的ValueError问题

这个错误我之前踩过坑,核心原因其实很好理解:相对导入(比如from .xxx import xxx)只能在Python包的上下文里生效,如果你的脚本被直接当作顶层文件运行,或者项目没被识别成可导入的包,就会触发这个报错。下面给你几个靠谱的修复方案,按优先级排序:

方案1:用Flask推荐的项目结构+启动脚本(最规范,强烈推荐)

首先确认你的项目结构是否符合标准,应该是这样的(假设你的项目根目录叫my_flask_app):

my_flask_app/
├── run.py          # 单独的启动脚本,绝对不要直接运行__init__.py
└── app/            # 你的核心包目录,名字随便取,比如叫`myapp`也行
    ├── __init__.py # 包初始化文件
    └── views/
        ├── __init__.py # 必须要有这个文件,让views成为子包(空文件都可以)
        └── home.py

然后修改app/__init__.py里的逻辑(你的原导入语句本身没问题,只要包结构正确就会生效):

from flask import Flask
app = Flask(__name__)

# 此时app是合法的包,views是它的子包,相对导入完全合法
from .views.home import home

# 注册蓝图等后续操作
app.register_blueprint(home)

接着在根目录的run.py里写启动逻辑:

from app import app

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

最后用python run.py启动项目,这时候Python会把app当作一个包导入,相对导入的上下文就有了,错误自然消失。

方案2:临时救急——用绝对导入+添加路径

要是你暂时不想调整项目结构,可以在__init__.py开头先把项目根目录加到Python的搜索路径里,然后改用绝对导入:

import sys
import os
# 把当前文件所在目录(项目根目录)添加到Python的模块搜索路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from flask import Flask
app = Flask(__name__)

# 改用绝对导入,不用相对路径
from views.home import home

不过这种方式不够规范,长期维护的话还是推荐方案1。

方案3:检查子目录的__init__.py

别忘了views目录下必须要有__init__.py文件,哪怕是空文件也行,否则Python不会把views识别成一个子包,相对导入from .views.home...就找不到对应的包路径。

为什么之前的在线方案没用?

很多方案只提了相对导入的写法,但没强调绝对不能直接运行__init__.py——如果你直接执行python __init__.py,Python会把这个文件当成顶层脚本,而不是包的一部分,这时候.就没有对应的包上下文,自然报错。必须通过导入包的方式启动,而不是直接运行包的初始化文件。

内容的提问来源于stack exchange,提问作者j-s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:41:15