宝塔Python项目需手动安装venv模块并用绝对路径创建虚拟环境,启动命令须指定venv内解释器和gunicorn路径,pip安装必须在venv中执行。

宝塔里 Python 环境默认不带 venv,得手动装
宝塔面板新建 Python 项目时选的“Python 版本”,只是指定了系统级解释器路径,并不会自动为你装好 venv 模块或初始化虚拟环境。很多用户点完“创建网站”就去 pip install,结果报错 ModuleNotFoundError: No module named 'venv'——这是因为 CentOS/Ubuntu 的最小化安装常缺 python3-venv 或 python3-distutils 包。
实操建议:
- 先 SSH 登录服务器,运行
python3 -m venv --help,如果报错,说明没装模块 - Ubuntu/Debian 执行:
apt install python3-venv python3-distutils - CentOS/RHEL 执行:
yum install python3-virtualenv python3-devel(注意:python3-virtualenv是旧包名,新版推荐用python3-venv,但部分镜像源仍需查证) - 装完再试
python3 -m venv test_env,能成功生成就说明就绪
在宝塔终端里创建虚拟环境,路径必须写绝对路径
宝塔自带的“终端”功能执行命令时,当前工作目录不固定,且 Web 面板后台任务(如计划任务、Python 项目启动)根本不会继承你的终端 pwd。直接跑 python3 -m venv env 很可能把环境建在 /www/wwwroot/ 下某个临时位置,导致后续 Nginx + Gunicorn 找不到解释器。
实操建议:
- 统一放在项目根目录下,例如你的站点根目录是
/www/wwwroot/myapp,那就执行:python3 -m venv /www/wwwroot/myapp/venv - 别用相对路径,也别建在
/tmp或用户家目录(如/root/venv),权限和生命周期都不稳定 - 建好后立刻检查权限:
ls -la /www/wwwroot/myapp/venv/bin/,确保activate和python可执行(否则 Gunicorn 启动时会卡在 “exec format error”)
Gunicorn 启动脚本里必须显式调用虚拟环境的 python
宝塔“Python 项目”功能里填的“启动命令”,看起来像 gunicorn run:app,但实际运行时它默认用的是系统 Python,不是你 venv 里的。结果就是 pip 装了一堆包,Gunicorn 却提示 ImportError: No module named flask。
实操建议:
- 启动命令必须写成完整路径:
/www/wwwroot/myapp/venv/bin/gunicorn run:app - 如果
venv里没装gunicorn,先激活环境:source /www/wwwroot/myapp/venv/bin/activate && pip install gunicorn - 更稳妥的做法:用
venv里的python直接跑 gunicorn 模块:/www/wwwroot/myapp/venv/bin/python -m gunicorn run:app(避免 PATH 混乱) - 记得在宝塔“Python 项目”设置页勾选“使用虚拟环境”,并填对
Python 解释器路径:/www/wwwroot/myapp/venv/bin/python
pip install 必须进 venv 再装,别信“全局 pip”
有人图省事,在 SSH 里直接 pip3 install flask,以为装到系统 Python 就行了;或者用宝塔“软件管理”里点“Python 项目依赖”,结果依赖装到了系统 site-packages。这两种方式都会让虚拟环境干净得像个新盘,一跑就缺包。
实操建议:
- 所有包必须在激活状态下装:
source /www/wwwroot/myapp/venv/bin/activate && pip install flask gevent - 或者不激活,用绝对路径调用:
/www/wwwroot/myapp/venv/bin/pip install flask - 装完检查:
/www/wwwroot/myapp/venv/bin/pip list,确认 flask、gunicorn 等都在列表里 - 别用宝塔“一键部署”里的 pip 功能——它默认走系统 pip,且不支持指定 venv 路径
宝塔对 Python 虚拟环境的支持是“可用但不自洽”的,核心在于它把“环境管理”和“进程管理”拆成了两件事:建 venv 是你 SSH 里干的,而 Gunicorn 启动是面板后台用另一套上下文跑的。最容易被忽略的,就是那个 Python 解释器路径 字段——它不光影响启动,还决定 pip 安装目标、日志编码、甚至子进程的 locale。填错一个字符,debug 时看到的错误信息可能完全指向错误方向。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










