为什么需要虚拟环境

新手最常见的事故现场:系统 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(无需激活即可调用)

常见坑

  1. python 命令不存在:老系统只有 python3,可 ln -s /usr/bin/python3 /usr/local/bin/python 或用 alternatives 管理
  2. 误改系统 Python:RHEL 系的 yum 依赖系统 Python,动它之前先想清楚
  3. requirements.txt 越滚越大:pip freeze 会把间接依赖也导出来,团队协作时可考虑 pip-tools 生成两份文件(requirements.in → requirements.txt)

小结

虚拟环境是 Python 工程化的第一课:一个项目一个环境,依赖全部锁版本,换机一条命令还原。后面写爬虫、写 FastAPI 服务,都基于这套环境体系。


本文是「Python」系列第 1 篇,下篇预告:Python 数据结构:列表、字典与集合。