本来在 B 站看了一个关于各种 conda 之间关系的视频,结果评论区好多人都提到了 pixi, 大家都说好。之前倒是没听说过,简单研究一下,记录一下相关用法。
pixi 是一个“现代化的包管理和项目管理工具”,在 Python 虚拟环境管理方面相比 conda 有很多显著优势。它基于 conda-forge 生态,使用 rust 编写,所以速度很快。看起来除了 Python 之外,pipx 还可以管理包含 rust、go 语言等其他语言的环境。
目前以我浅薄的了解,pixi 主要用在单个项目的环境管理,同时也能创建全局环境,在项目外也可使用。
安装
Linux 和 macOS 端比较简单,直接运行:
1
|
curl -fsSL https://pixi.sh/install.sh | sh
|
Windows 端可以使用:
1
|
powershell -ExecutionPolicy ByPass -c "irm -useb https://pixi.sh/install.ps1 | iex"
|
同时支持 Homebrew、winget、scoop 等方式安装。我就直接使用 scoop 进行下载安装了。
在项目中使用
pixi 主要用在项目管理中,其一些主要的用法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# 创建新项目
pixi init my-project
cd my-project
# 添加依赖(自动安装和更新环境),默认从 conda-forge 安装
pixi add numpy pandas
# 指定安装渠道
pixi add pytorch --channel pytorch
pixi add --pypi requests
# 在当前环境执行命令
pixi run python script.py
pixi run pytest
# 在当前环境运行任务,任务需在 toml 文件 [tasks] 中定义
pixi run start
pixi run test
# 新建一个临时环境执行命令
pixi exec python -VV
# 进入环境
pixi shell
# 按配置文件安装依赖
pixi install
|
与 conda 的常用工作流进行对比:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 创建环境
conda create -n myenv python=3.9
conda activate myenv
# 安装包
conda install numpy pandas
pip install requests # 混用 pip
# 导出环境
conda env export > environment.yml
# 在新机器上重建
conda env create -f environment.yml
|
相对地,pixi 的工作流:
1
2
3
4
5
6
7
8
9
10
11
12
|
# 初始化项目
pixi init
# 添加依赖(自动创建和管理环境)
pixi add python=3.9 numpy pandas
pixi add --pypi requests
# 运行项目(自动激活环境)
pixi run python main.py
# 分享项目(包含锁定文件)
# 其他人只需:pixi install
|
项目配置文件
对于项目环境的配置,会写入项目目录下的 pixi.toml
(pixi 默认使用)或 pyproject.toml
文件。对于 Python 来说,pyproject.toml
文件是标准的项目配置文件,如果想生成一个通用的配置文件以供其他文件使用,可通过以下命令指定配置文件名称:
1
|
pixi init --format pyproject
|
而在 pixi 中使用 pypi 通道安装软件包,则会写入配置文件中的 [dependencies]
下,可供其他如 uv 等类似工具使用。
多环境管理
在一个项目中可能需要若干隔离的环境,下方命令可以指定某个环境进行操作:
1
2
3
4
5
6
7
8
|
# 在 test 环境下添加 pytest 依赖
pixi add --pypi --feature test pytest
# 安装 test 环境的依赖
pixi install --environment test
# 在 test 环境下运行
pixi run --environment test pytest
|
在全局环境使用
本来以为 pixi global 和 conda 的使用方法类似,但并不是。个人理解为可以在随处调用 pixi 某环境的一种快捷方式。例如我创建了一个名为 test
的全局环境,其中安装了 Python 3.11, 并将其暴露(expose)为 py311
。 那么我在终端中任意路径下键入 py311
,都会直接进入该环境下的 Python,而不需要手动激活该环境,这也跳出了单个项目的独立环境。相关用法如下:
1
2
3
4
5
6
7
8
|
# 创建一个名为 test 的环境,安装 Python 3.11,设置 py311 别名
pixi global install python=3.11 --environment test --expose py311=python
# 在该环境中添加 numpy 依赖
pixi global add numpy --environment test
# 查看环境情况
pixi global list
|
结果如下:
1
2
3
|
└── test
├─ dependencies: python 3.11.13, numpy 2.3.2
└─ exposes: py311 -> python
|
需要注意的是,pixi global 环境不能像项目环境一样进入 shell. Windows 下需要将 C:\Users\<username>\.pixi\bin
目录加入 PATH 环境变量才能生效 expose。
更换镜像源
与 conda 和 pypi 类似,使用 pixi 也可以换源,毕竟用的就是 conda 和 pypi 安装软件包。方法是在 pixi 的 config.toml
文件中写入相应的镜像信息。pixi 可以按优先级加载多个路径的 config.toml
文件,各系统下配置文件路径可点此查看。不同路径配置文件的生效范围不同,详细内容可见文档中的备注部分,可按需求进行分级配置。下面以清华源为例,在 config.toml
中写入以内内容即可:
1
2
3
4
5
6
7
8
9
10
11
12
|
# conda 镜像
[mirrors]
"https://conda.anaconda.org/conda-forge" = [
"https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge",
]
"https://conda.anaconda.org/pytorch" = [
"https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch",
]
# pypi 镜像
[pypi-config]
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|