Pixi
人生苦短,我用pixi...
前言
前文见:conda你真的可以去死了。
在写了三四个月的文档之后,又要做深度学习开发了,正受Conda困扰之时,被推荐了uv和pixi,稍作了解之后选择了pixi并决定用上一阵。就目前的体验来说,pixi开发非常符合一般现代项目的开发方式,conda/mamba基本就可以彻底扔一边了。
简介
Pixi是由prefix.dev开发的新一代跨平台、多语言软件包管理与工作流工具。其底层基于Rust编写的rattler库,并集成uv作为PyPI解析后端,旨在彻底解决Conda生态中解析缓慢、环境不可复现及跨语言依赖混乱的痛点。
下表对比了Python生态下常见的包管理方案。
| 工具 | 定位 | 依赖范围 | 速度 | 是否管 Python 版本 | 可复现性 | 典型场景 |
|---|---|---|---|---|---|---|
| pip | 包安装器 | 仅 Python 包 | 慢 | 否 | 弱 | 官方标准、最小工具链 |
| venv | 环境隔离 | 无依赖管理 | — | 否 | — | 轻量虚拟环境 |
| conda | 环境+包管理 | Python + 非 Python | 中 | 是 | 强 | 科学计算、跨语言依赖 |
| mamba | conda 加速器 | 同 conda | 快 | 是 | 强 | conda 的性能替代 |
| uv | pip+venv+resolver | Python 包 | 极快 | 否 | 强 | 现代 Python 开发 |
| pixi | conda-like | 多语言 | 快 | 是 | 很强 | 可复现实验/项目级环境 |
| poetry | 项目级管理 | Python 包 | 中 | 否 | 强 | 应用/库开发 |
| pipenv | pip+venv | Python 包 | 慢 | 否 | 中 | 已逐渐弱化 |
Pixi 核心优势: 它在继承Conda强大的二进制分发(如CUDA、C++编译器)与跨语言管理能力的同时,引入了类似Cargo(Rust)和pnpm(Node.js)的现代工作流体验,通过极致的解析速度与严格的锁定机制,实现了“一次配置,全机房复现”的开发闭环。
基本概念
工作机制与本地化环境
Pixi采用以项目为中心的管理模式。运行pixi init后,它不再像传统Conda那样将环境存储在全局anaconda3/envs路径下,而是在项目根目录创建.pixi/隐藏文件夹。所有二进制文件、库和Python解释器均硬链接至此,确保环境与项目生命周期同步,且不同项目间物理隔离。
核心配置文件
Pixi的运行高度依赖以下两个文件:
pixi.toml(清单文件): 类似于package.json。用于声明项目元数据、支持的平台、Conda渠道优先级以及项目依赖(包括[dependencies]和[pypi-dependencies])。pixi.lock(锁文件): 类似于yarn.lock或package-lock.json。该文件由Pixi自动生成,详细记录了所有依赖包的精确版本、哈希值及下载地址。它是跨平台复现的核心,确保团队成员在不同机器上安装的内容完全一致。
任务系统(Tasks)
Pixi 内置了功能强大的跨平台Task Runner。在pixi.toml的[tasks]部分,开发者可以定义复杂的命令流:
- 跨平台兼容: Pixi提供内置Shell模拟器,使
rm -rf或export等命令在Windows和Linux上表现一致。 - 依赖链管理: 任务可以设置
depends-on属性。例如,定义train任务依赖于preprocess,运行前者会自动先触发后者。 - 缓存与增量: 支持根据文件变化(inputs/outputs)决定是否跳过已完成的任务,极大提升深度学习预处理效率。
体验和补充
整体体验
可以用pixi shell保持环境active(使用exit或ctrl+d退出)。或者使用task时,用pixi run {taskname}。这二者也不互斥,无论在不在shell环境都可以用同样的命令调用task。
Pixi几乎到处都是优势:极简的安装流程、卓越的多平台兼容性、毫秒级的依赖解析与并发下载速度。即便遭遇复杂的版本冲突,pixi也会提供详尽的冲突路径图辅助解决。在二进制文件的处理上,Windows这块难啃的骨头pixi处理得相对轻松,相对于体积庞大且难用的MSVC,Pixi允许在Windows上使用轻量的MinGW或Clang工具链。
总的来说,Pixi标志着Python环境管理进入了“声明式”时代,是深度学习项目实现工程化复现的最佳实践。
补充
项目迁移到pixi
从Pixi迁移回去就暂时不考虑了。
从Conda或Pip迁移至Pixi是深度学习开发中的常见需求。手动将数百行依赖填入配置文件不仅低效,更易导致解析冲突。Pixi提供了自动化导入机制来简化这一过程:
- 导入
requirements.txt:
执行指令:pixi import --format pypi-txt --environment default .\requirements.txt
该指令会强制Pixi将现有的Pip需求清单解析并转化为pixi.toml中的[pypi-dependencies]。--format pypi-txt 明确了输入源格式,而--environment default则指定将这些依赖注入项目的默认运行环境。
- 导入
environment.yml:
针对Conda环境文件,可直接运行pixi import environment.yml。Pixi会自动映射已有的Conda渠道(Channels)和依赖列表,将其转换为Pixi 生的配置结构,避免了人工比对版本的麻烦。
配置
针对国内网络环境及深度学习特有的二进制包下载需求,可通过在pixi.toml 中配置[pypi-options]优化链路:
- 加速基础 Python 包下载:
需求: 默认PyPI源在境内访问速度较慢,可以切换至清华等国内镜像源以加速下载。
配置: index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
- 安装特定版本的 CUDA/PyTorch:
需求: 许多深度学习框架的特定版本(如CUDA 12.4编译版)并未发布在标准PyPI,需指定官方的Wheel仓库路径进行检索。
配置: extra-index-urls = ["https://download.pytorch.org/whl/cu124"](示例)
- 解决多源依赖冲突:
需求: 当主源与额外源(Extra URLs)中存在同名不同版本的包(例如packaging)时,需要强制Pixi在所有源中搜寻并匹配最符合当前环境的版本,而非在找到第一个源后立即停止。
配置: index-strategy = "unsafe-best-match"