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 及以上版本无需安装任何东西就能使用。
创建虚拟环境
在项目目录下执行:
实例
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 安装包,建议同时指定国内镜像加速下载:
实例
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:
实例
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 是项目的依赖声明文件,初始内容如下:
实例
[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 两套命令任选其一即可:
实例
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('环境就绪')"
输出结果如下所示:
环境就绪
点我分享笔记