为什么需要虚拟环境
新手最常见的事故现场:系统 Python 里装了一堆包,某天升级一个库,另一个项目直接崩了。**虚拟环境(Virtual Environment)**就是给每个项目一个独立、干净的 Python 运行空间,互不干扰。
一、安装 Python(多版本共存)
CentOS / OpenCloudOS 系:
# 查看自带的 python3
python3 --version
# 安装开发工具与依赖(编译源码时需要)
dnf groupinstall -y "Development Tools"
dnf install -y openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel
# 编译安装另一个版本(以 3.11 为例),用 make altinstall 避免覆盖系统 python3
cd /tmp
curl -LO https://mirrors.huaweicloud.com/python/3.11.4/Python-3.11.4.tgz
tar -xzf Python-3.11.4.tgz && cd Python-3.11.4
./configure --prefix=/usr/local/python311 --enable-optimizations
make -j$(nproc) && make altinstall
⚠️ 一定要用
make altinstall而不是make install,否则会覆盖系统的/usr/bin/python3,导致 yum/dnf 等工具罢工。
二、venv:内置的虚拟环境方案
Python 3.3+ 自带 venv 模块,无需额外安装:
# 创建虚拟环境(习惯放在项目下的 .venv 目录)
python3 -m venv .venv
# 激活
source .venv/bin/activate
# 激活后提示符前面会出现 (.venv),此时 pip 安装的包只进这个环境
(.venv) $ pip install requests
# 退出虚拟环境
deactivate
激活虚拟环境后发生了什么?本质是把 .venv/bin 插到了 PATH 最前面:
(.venv) $ which python
/opt/myproject/.venv/bin/python
三、pip 使用与国内源
pip install requests # 安装
pip install "flask==2.3.2" # 指定版本
pip install -U pip # 升级自己
pip list # 已安装列表
pip show requests # 查看某个包详情
pip uninstall requests # 卸载
国内服务器直连 PyPI 很慢,换成清华源(一劳永逸的写法):
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
也可以只对单次安装生效:
pip install -i https://mirrors.aliyun.com/pypi/simple/ requests
四、依赖管理:requirements.txt
# 导出当前环境全部依赖
pip freeze > requirements.txt
# 在新环境一键还原
pip install -r requirements.txt
一个实用的 requirements.txt 长这样(建议锁版本):
requests==2.31.0
flask==2.3.2
gunicorn==21.2.0
五、常用组合技
| 场景 | 命令 |
|---|---|
| 给每个项目独立环境 | python3 -m venv .venv && source .venv/bin/activate |
| 优雅删除环境 | 直接 rm -rf .venv(它只是一个目录) |
| 迁移项目 | 新机器 python3 -m venv .venv + pip install -r requirements.txt |
| 生产部署 | .venv/bin/gunicorn app:app(无需激活即可调用) |
常见坑
python命令不存在:老系统只有python3,可ln -s /usr/bin/python3 /usr/local/bin/python或用alternatives管理- 误改系统 Python:RHEL 系的 yum 依赖系统 Python,动它之前先想清楚
- requirements.txt 越滚越大:
pip freeze会把间接依赖也导出来,团队协作时可考虑pip-tools生成两份文件(requirements.in → requirements.txt)
小结
虚拟环境是 Python 工程化的第一课:一个项目一个环境,依赖全部锁版本,换机一条命令还原。后面写爬虫、写 FastAPI 服务,都基于这套环境体系。
本文是「Python」系列第 1 篇,下篇预告:Python 数据结构:列表、字典与集合。