Python 是当前最受欢迎的编程语言之一,广泛用于 Web 开发(Django/Flask/FastAPI)、数据处理、自动化脚本和机器学习。在搬瓦工 VPS 上,Debian/Ubuntu 已预装 Python 3,但生产环境的最佳实践是隔离每个项目的依赖——本文介绍 python3/pip 的基础用法、venv 虚拟环境的创建与管理,以及 pyenv 多版本管理工具。

本文要点

  • 确认系统 Python 3 版本与 pip 安装
  • venv 创建和使用隔离虚拟环境
  • requirements.txt 依赖管理
  • pyenv 安装与多版本管理

确认 Python 3 与安装 pip

python3 --version          # 查看系统 Python 3 版本
apt install -y python3-pip  # 安装 pip(如未安装)
pip3 --version

Debian/Ubuntu 系统 Python 不建议 pip install 到系统

直接向系统 Python 安装包会污染系统环境,某些发行版也已禁止(PEP 668)。请始终在虚拟环境中安装包。

使用 venv 创建虚拟环境

创建虚拟环境

apt install -y python3-venv  # 确保 venv 模块可用

# 在项目目录创建虚拟环境
cd /srv/myproject
python3 -m venv .venv

激活虚拟环境

source .venv/bin/activate
# 激活后提示符变为 (.venv) ...
python --version   # 此时 python 指向虚拟环境的 Python
pip --version      # pip 也是虚拟环境内的

在虚拟环境中安装包

pip install flask
pip install requests
pip list              # 列出已安装包

导出与复现依赖

pip freeze > requirements.txt     # 导出依赖列表
pip install -r requirements.txt   # 在新环境复现依赖

退出虚拟环境

deactivate

虚拟环境目录结构

路径说明
.venv/bin/python、pip 等可执行文件
.venv/lib/pythonX.Y/site-packages/已安装的包
.venv/pyvenv.cfg虚拟环境配置(Python 版本等)

不要把 .venv 目录提交到版本库

虚拟环境包含大量二进制文件,应加入 .gitignore。用 requirements.txt 描述依赖,在新环境重新创建虚拟环境。

使用 pyenv 管理多版本 Python

如果需要在同一台服务器运行多个 Python 版本(如 3.9、3.11、3.12),pyenv 是最好的选择:

安装 pyenv 依赖

apt install -y make build-essential libssl-dev zlib1g-dev \
  libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
  libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
  libffi-dev liblzma-dev

安装 pyenv

curl https://pyenv.run | bash

# 将以下内容追加到 ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

source ~/.bashrc

安装与使用指定 Python 版本

pyenv install --list | grep "3\.1"  # 查看可安装的 3.1x 版本
pyenv install 3.12.4                 # 安装指定版本
pyenv global 3.12.4                  # 全局使用
pyenv local 3.11.9                   # 仅当前目录使用
pyenv versions                       # 列出已安装版本

小结

  • 每个项目用独立的 venv 虚拟环境,避免依赖冲突
  • requirements.txt 记录依赖,方便迁移和协作
  • pyenv 管理多版本,按项目灵活切换
  • 不要直接向系统 Python 安装包

常见问题

pip install 提示 externally-managed-environment 怎么办?

这是 PEP 668 保护机制,防止污染系统。请在 venv 虚拟环境内安装,或使用 pipx 安装独立工具。

虚拟环境和 pyenv 能一起用吗?

完全可以。pyenv 管理 Python 版本,venv 管理项目依赖,两者配合使用是最佳实践:先用 pyenv local 指定版本,再用 python -m venv .venv 创建环境。

如何在 systemd 服务中使用虚拟环境的 Python?

在 systemd unit 文件的 ExecStart 中使用虚拟环境的绝对路径:ExecStart=/srv/myproject/.venv/bin/python app.py,不需要 activate。