Python 虚拟环境设置(venv 与 uv)

在开始量化之前,先解决一个所有 Python 项目都绕不开的问题:环境隔离。

本篇介绍两个轻量工具——Python 内置的 venv 和新一代极速工具 uv,并用它们为量化课程准备好环境。


为什么需要虚拟环境

想象一个常见场景:你半年前写的一个策略脚本依赖 pandas 1.x,今天新学的教程要求 pandas 2.x,而它们无法共存于同一个系统环境。

直接在系统 Python 里反复装卸不同版本的包,最终往往把环境搅成一团乱麻,俗称"依赖地狱"。

虚拟环境的思路很简单:给每个项目一个独立的包安装目录,互不干扰。

量化项目尤其需要它——回测、机器学习、数据抓取可能各自依赖不同版本的库,一个独立的 quant 环境能保证后续教程的代码始终按预期运行。


三种方案怎么分工

Python 生态里常用的环境方案有三个,定位各不相同:

工具 定位 适合谁
venv Python 内置,最基础的虚拟环境方案 所有 Python 用户,零安装成本
uv 新一代工具,环境 + 依赖 + Python 版本一体化管理,速度极快 追求效率的开发者,本篇推荐
Anaconda(conda) 数据科学全家桶发行版,预装科学计算库并自带 conda 环境 数据科学初学者,见Anaconda 教程

三者解决的是同一类问题,实际使用中选其一即可。

本篇先讲内置的 venv 建立概念,再讲效率更高的 uv,下一篇介绍 Anaconda。


venv:Python 内置方案

venv 是 Python 官方自带的虚拟环境模块,Python 3.3 及以上版本无需安装任何东西就能使用。

创建虚拟环境

在项目目录下执行:

实例

# 创建名为 quant-env 的虚拟环境
python3 -m venv quant-env

命令执行后没有任何输出,就表示创建成功。

当前目录会多出一个 quant-env 文件夹,里面是一套独立的 Python 解释器和包目录,之后这个环境里安装的所有包都存放在这里。

激活与退出

创建好的环境需要"激活"后使用,不同平台的命令不同:

平台 激活命令
macOS / Linux(bash、zsh) source quant-env/bin/activate
Windows(PowerShell) .\quant-env\Scripts\Activate.ps1
Windows(CMD) quant-env\Scripts\activate.bat

激活成功后,命令行提示符前面会出现环境名称:

(quant-env) $ which python
/private/tmp/qt_venv_demo/quant-env/bin/python

(quant-env) $ python -V
Python 3.9.6

注意 which python 的输出:激活后 python 命令指向虚拟环境内部的解释器,此时 pip 安装的所有包都只进入这个环境。

退出环境只需一条命令:

(quant-env) $ deactivate

退出后命令行提示符恢复原样,python 命令也回到系统环境。

易错点:虚拟环境与目录绑定而非与终端绑定,换了终端窗口要先重新激活;删除环境则直接删除 quant-env 文件夹即可,不会影响系统 Python。

安装依赖与复现环境

激活环境后,用 pip 安装包,建议同时指定国内镜像加速下载:

实例

# 安装包:-i 指定清华镜像源,国内网络下载更快
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple six

输出结果如下所示:

Collecting six
  Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six
Successfully installed six-1.17.0

把当前环境的依赖清单导出到 requirements.txt,是分享和复现环境的标准做法:

实例

# 导出依赖清单(包名 == 精确版本号)
pip freeze > requirements.txt

# 查看内容
cat requirements.txt

输出结果如下所示:

six==1.17.0

别人拿到这份清单后,创建一个新环境并用一条命令即可装齐全部依赖:

pip install -r requirements.txt

venv 的局限

venv 解决了"隔离"问题,但有两个日常痛点:

一是慢:每个新环境安装依赖都要从网络重新下载,多项目并行时等待时间可观。

二是裸:没有依赖锁文件(requirements.txt 里不含依赖的依赖),没有 Python 版本管理,团队协作时环境复现经常出现偏差。

这些痛点正是下面 uv 的用武之地。


uv:新一代极速方案

uv 是 Astral 公司(知名工具 Ruff 的开发方)用 Rust 编写的 Python 环境与包管理工具。

它兼容 pip 的使用习惯,同时把虚拟环境、依赖管理、Python 版本管理整合到一个工具里,速度远超传统方案。

安装 uv

macOS / Linux 用官方脚本安装:

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows PowerShell 用对应脚本:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

如果装有 Homebrew,也可以直接:

brew install uv

安装完成后验证版本:

$ uv --version
uv 0.10.0 (0ba432459 2026-02-05)

创建环境与安装依赖

uv 创建虚拟环境的命令是 uv venv:

实例

# 创建名为 quant-uv-env 的虚拟环境
uv venv quant-uv-env

输出结果如下所示:

Using CPython 3.12.11
Creating virtual environment at: quant-uv-env
Activate with: source quant-uv-env/bin/activate

注意第一行:venv 只能使用当前系统的 Python 版本,而 uv 会自动选择(必要时自动下载)合适的 Python 版本,相当于自带了 Python 版本管理。

激活方式与 venv 相同,激活后用 uv pip 安装包,命令习惯与 pip 一致:

实例

# 激活环境
source quant-uv-env/bin/activate

# 安装包,兼容 pip 的参数写法
uv pip install --index-url https://pypi.tuna.tsinghua.edu.cn/simple six

输出结果如下所示:

Resolved 1 package in 6ms
Prepared 1 package in 442ms
Installed 1 package in 4ms
 + six==1.17.0

查看已安装的包:

$ uv pip list
Using Python 3.12.11 environment at: /tmp/qt_venv_demo/quant-uv-env
Package Version
------- -------
six     1.17.0

速度到底快在哪

uv 的速度优势需要分情况看,下面是一次本机实测(macOS,清华镜像,安装 pandas):

场景 耗时 说明
pip 首次安装 17.1 秒 时间主要花在从网络下载
uv 首次安装 13.7 秒 同样受网络下载限制,优势不大
uv 再次安装(缓存命中) 0.1 秒 uv 有全局缓存,装过的包不再走网络

结论很清晰:受网络下载限制时,两者差距有限;而 uv 的本质优势在于全局缓存——新建环境、重装依赖时几乎瞬时完成。

项目越多、环境越多,这项优势越明显。

说明:表中为一次实测数据,绝对值随网络状况浮动,但量级关系是稳定的。尤其多环境批量装依赖的场景,uv 的缓存优势会进一步放大。

项目管理模式

除了充当"更快的 pip",uv 还提供基于 pyproject.toml 的现代项目管理工作流:

实例

# 初始化一个新项目
uv init --name quant-demo

# 添加依赖(自动写入 pyproject.toml 并生成 uv.lock)
uv add six

# 在项目环境中运行任意命令
uv run python -c "import six; print('six 版本:', six.__version__)"

uv init 会在当前目录生成标准的项目结构:

.git  .gitignore  .python-version  main.py  pyproject.toml  README.md

其中 pyproject.toml 是项目的依赖声明文件,初始内容如下:

实例

# 文件路径:pyproject.toml
[project]
name = "quant-demo"          # 项目名
version = "0.1.0"            # 项目版本
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"   # 要求的 Python 版本
dependencies = []            # 依赖列表,uv add 后自动写入

执行 uv add six 后,dependencies 会自动写入 "six>=1.17.0",同时生成锁文件 uv.lock,精确记录每个依赖的版本。

uv add 与 uv run 的输出如下所示:

$ uv add six
Resolved 2 packages in 5ms
Prepared 1 package in 10.75s
Installed 1 package in 3ms
 + six==1.17.0

$ uv run python -c "import six; print('six 版本:', six.__version__)"
six 版本: 1.17.0

有了 pyproject.toml 和 uv.lock,团队成员拿到代码后一条 uv sync 就能还原出完全一致的环境,这是 venv + requirements.txt 做不到的。

提示:本教程只需要 uv venv 加 uv pip 这一组兼容命令即可跟上进度;项目管理模式供有兴趣的读者进阶。


venv 与 uv 怎么选

对比项 venv uv
是否需要安装 Python 自带,零安装 需单独安装(一条命令)
环境创建与安装速度 常规 极快,缓存命中后近乎瞬时
Python 版本管理 只能用当前系统版本 自动选择并安装所需版本
依赖锁定 无(requirements.txt 不完整) uv.lock 精确锁定
学习成本 最低 低(兼容 pip 习惯)

给初学者的建议:系统里装一个 uv,把它当作更快的 pip 来用,其余概念与 venv 完全互通。


实战:为量化课程准备环境

用今天学的方式创建量化专用环境,装好后续章节需要的库。venv 与 uv 两套命令任选其一即可:

实例

# ========== 方案一:venv ==========
python3 -m venv quant-env               # 创建环境
source quant-env/bin/activate           # 激活(Windows 用 Activate.ps1)

# ========== 方案二:uv ==========
uv venv quant-env                       # 创建环境
source quant-env/bin/activate           # 激活

# ========== 以下两套方案通用 ==========
# 安装量化基础库:数据处理、数值计算、可视化
uv pip install pandas numpy matplotlib   # venv 用户把 uv pip 换成 pip 即可

# 安装金融数据与图表库(后续章节使用)
uv pip install yfinance akshare pyecharts

# 验证安装
python -c "import pandas, numpy, matplotlib, yfinance, akshare, pyecharts; print('环境就绪')"

输出结果如下所示:

环境就绪