根本原因是宝塔默认使用系统python而非项目虚拟环境,导致依赖安装路径与运行环境不一致;必须统一python解释器、虚拟环境、requirements.txt三者的绝对路径,并用终端逐条验证可执行性、可读性和可写性。

Python解释器路径没填对,依赖装到系统site-packages里了
宝塔项目管理器默认用系统 Python(比如 /usr/bin/python3),但你本地开发用的是虚拟环境,pip install -r requirements.txt 实际装进了系统目录,而项目运行时却在找虚拟环境里的包,自然报 ModuleNotFoundError。
必须手动指定 Python 解释器的绝对路径,不能只填 python3 或留空:
- 虚拟环境路径示例:
/www/wwwroot/myapp/venv/bin/python3 - pyenv 环境路径示例:
/root/.pyenv/versions/3.11.9/bin/python3 - 填错后执行
/www/wwwroot/myapp/venv/bin/python3 -m pip list会发现你要的包根本不在输出里 - 如果
pip list显示一堆系统包(如setuptools,wheel),说明路径错了,正在往系统 site-packages 写
requirements.txt 路径写相对路径,宝塔直接忽略
宝塔“更新依赖文件”功能只认绝对路径。填 requirements.txt 或 ./requirements.txt 都不会生效,界面显示“更新成功”,实际什么都没装。
正确做法是把文件路径补全:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 填入类似:
/www/wwwroot/myapp/requirements.txt - 确保该文件真实存在且可读(
ls -l /www/wwwroot/myapp/requirements.txt) - 如果项目用了
poetry,先在服务器上运行:poetry export -f requirements.txt --without-hashes > /www/wwwroot/myapp/requirements.txt - 如果用了
pipenv,运行:pipenv requirements > /www/wwwroot/myapp/requirements.txt
点“更新依赖文件”后没反应?pip静默失败很常见
宝塔不展示 pip 的 stderr 输出,所谓“更新成功”可能只是命令退出码为 0,但实际因权限、网络或缓存卡在半路。最可靠的方式永远是进终端手动验证:
- 检查是否真装上了:
/www/wwwroot/myapp/venv/bin/python3 -m pip list | grep flask(换成你的关键包名) - 强制重装(跳过缓存):
/www/wwwroot/myapp/venv/bin/python3 -m pip install --force-reinstall -r /www/wwwroot/myapp/requirements.txt - 若报
PermissionError: [Errno 13] Permission denied,证明 Python 路径仍不对,pip 正试图往/usr/local/lib/python3.x/site-packages写 - 别依赖“更新依赖文件”按钮——尤其对 Poetry/Pipenv 项目,它完全不识别
pyproject.toml或Pipfile
WSGI 入口函数名大小写/拼写错一个,Gunicorn就502
宝塔靠 Nginx 反向代理到 Gunicorn/uWSGI,而 WSGI 入口文件(如 app.py)里那个变量名,必须和后台填的一模一样。多一个下划线、少一个字母、大小写不对,都会触发 AttributeError: 'module' object has no attribute 'application'。
常见匹配规则:
- Flask 默认暴露
application(不是app),入口文件末尾删掉if __name__ == '__main__': app.run() - FastAPI 需包装:
app = FastAPI(); application = app,否则填app会失败 - Django 的
wsgi.py里固定是application,别改成get_wsgi_application() - 宝塔后台填的是
app.py(相对路径)和application(纯变量名),不是app.py:application
真正容易被忽略的是:虚拟环境路径、Python 解释器路径、requirements.txt 路径这三者必须全部用绝对路径,且指向同一套环境;任何一处用错,后续所有依赖和运行逻辑都会脱节。调试时别只盯着报错信息,先用终端逐条验证这三个路径是否真实可执行、可读、可写。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










