Python 开发环境看似简单,实则坑多。项目跑不起来,多半是环境问题——版本冲突、依赖污染、终端显示乱码,每一个都足以浪费你一个下午。这篇文章把虚拟环境管理、pyenv 多版本切换、以及开发字体选择三件事讲清楚,帮你从"能跑"升级到"稳跑"。
虚拟环境:项目隔离的第一道防线
全局 pip install 是新手最常见的坏习惯。一旦你在全局装了 Flask 2.3,另一个项目需要 Flask 1.1,冲突就来了。虚拟环境的核心价值:每个项目拥有独立的包目录和 Python 解释器路径,互不干扰。
Python 3.3 之后内置了 venv 模块,不再需要安装 virtualenv 包(除非你要支持 Python 2)。日常用法如下:
# 在项目根目录创建虚拟环境
python -m venv .venv
# 激活(Linux / macOS)
source .venv/bin/activate
# 激活(Windows PowerShell)
.venv\Scripts\Activate.ps1
# 安装项目依赖
pip install -r requirements.txt
# 退出虚拟环境
deactivate
激活后,shell 提示符会加上 (.venv) 前缀,which python 指向 .venv/bin/python,pip install 的包只装在 .venv/lib/ 下。退出后一切恢复全局状态。
几个容易忽略的细节:
.venv不要提交到 Git。在.gitignore里加一行.venv/。--system-site-packages谨慎使用。加上这个 flag 创建的 venv 会继承全局包,看似方便,实则重新引入污染风险。- 升级 venv 内的 pip。新建的 venv 里 pip 版本往往偏旧,激活后先跑
pip install --upgrade pip。
如果你用的是更现代的工具链,uv 或 conda 也能做隔离,但 venv 是零依赖、最稳定的起点。
pyenv:在同一台机器上装多个 Python 版本
生产服务器跑 3.11,新项目想试 3.13,老代码还卡在 3.8——这种场景下 pyenv 是最干净的解法。它通过 shim 机制拦截 python 命令,按目录或全局设定转发到对应版本,不需要改系统自带 Python。
安装 pyenv 本身(macOS 为例):
brew install pyenv
# 把以下内容加到 ~/.zshrc(bash 用户加到 ~/.bashrc)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
重启终端后,pyenv 就生效了。接下来安装你需要的 Python 版本:
# 查看可安装版本
pyenv install --list | grep "3\.1[0-3]"
# 安装具体版本(编译较慢,耐心等)
pyenv install 3.11.9
pyenv install 3.13.0
# 设为全局默认
pyenv global 3.11.9
# 在某个项目目录下设为局部版本
cd ~/projects/legacy-app
pyenv local 3.8.18 # 会生成 .python-version 文件
# 验证
python --version
# 输出与当前目录/全局设定一致
pyenv local 生成的 .python-version 文件应该提交到 Git,这样团队所有人 clone 后只要装了 pyenv,进目录就能自动切到正确版本。
编译失败的常见原因:缺少 C 编译器或头文件。macOS 上跑 xcode-select --install;Ubuntu/Debian 上跑 sudo apt install build-essential zlib1g-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev libffi-dev。pyenv 编译 Python 需要这些依赖,缺一个就会报错中断。
字体:被低估的开发体验变量
选字体不是审美偏好,而是工程决策。等宽字体决定了你在终端和编辑器里对齐代码、分辨相似字符、长时间阅读的效率。几个硬性筛选标准:
- 能区分
0和O、1和l、{和(。编程时混淆这些字符会直接导致 bug。 - 连字(ligatures)可选但非必须。Fira Code、JetBrains Mono 把
=>渲染成单符号,好看,但在 diff 工具和部分终端里可能显示异常。如果你用连字字体,确认所有工具链都支持。 - 行间距适中。太紧凑的字体在滚动阅读时容易串行。
推荐几个经过社区长期验证的选项:
| 字体 | 特点 | 连字 |
|---|---|---|
| JetBrains Mono | 专为 JetBrains IDE 设计,区分度高 | 有 |
| Fira Code | GitHub 上最流行的编程连字字体 | 有 |
| IBM Plex Mono | 无连字,清晰克制,适合终端 | 无 |
| Source Code Pro | Adobe 出品,经典稳定 | 无 |
安装方式因平台不同,最通用的做法是从 GitHub Releases 下载 .zip,解压后双击字体文件点击"安装"。macOS 用户也可以用 Homebrew:
brew tap homebrew/cask-fonts
brew install --cask font-jetbrains-mono
装完后在终端(iTerm2 / Windows Terminal)和编辑器(VS Code 的 Editor: Font Family 设置)里指定字体名即可。
一套可复用的环境初始化脚本
把上面三件事串起来,每次新建项目时可以跑这个脚本:
#!/usr/bin/env bash
# new-python-project.sh — 初始化一个干净的 Python 项目环境
set -euo pipefail
PROJECT_NAME="${1:?用法: new-python-project.sh <项目名>}"
PYTHON_VERSION="${2:-3.11.9}"
# 1. 创建项目目录
mkdir -p "$PROJECT_NAME" && cd "$PROJECT_NAME"
# 2. 设定局部 Python 版本(需要 pyenv)
pyenv local "$PYTHON_VERSION"
# 3. 创建虚拟环境
python -m venv .venv
# 4. 激活并升级 pip
source .venv/bin/activate
pip install --upgrade pip
# 5. 生成初始 requirements.txt
touch requirements.txt
# 6. 初始化 Git 并忽略 .venv
git init
echo ".venv/" >> .gitignore
echo ".python-version" >> .gitignore # 视团队约定,也可提交此文件
echo "✅ 项目 $PROJECT_NAME 已就绪,Python $PYTHON_VERSION"
echo " 激活环境: source .venv/bin/activate"
使用方式:
chmod +x new-python-project.sh
./new-python-project.sh my-api 3.13.0
脚本假设 pyenv 已安装且目标版本已编译好。如果 pyenv local 报版本不存在,先跑 pyenv install <版本号>。
环境配置检查清单
每次换机器或接手新项目,过一遍这个清单,能省掉大量排查时间:
- [ ] pyenv 已安装,
pyenv versions列出所需版本 - [ ] 项目目录下
.python-version存在且内容正确 - [ ]
.venv/在.gitignore中,未被提交 - [ ] 激活 venv 后
which python指向.venv/bin/python - [ ]
pip list输出与requirements.txt一致 - [ ] 终端和编辑器字体已设定为等宽编程字体,
0O1l可区分
环境稳了,后面写代码才不会反复被"怎么又跑不起来"打断。