pixi(conda系パッケージマネージャー)を使う
皆さんこんにちは。株式会社アイデミー・データサイエンティストの藤井(X | LinkedIn)です。
僕は普段からPythonのパッケージマネージャーとしてuvを使用することが多いのですが、似たような機能を持つパッケージマネージャーとしてpixiというものがあることを最近知りました。
実際にちょっと触ってみた結果割と良さそうだと感じた一方で、uvに比べてマイナーであること、そして「pixi」という名前故のググラビリティの低さから使い方のまとめ記事などが簡単に見つけられなかったので、自分でまとめておくことにしました。
pixiの特徴
pixiはconda-forgeを中心とするcondaエコシステムをバックエンドとしたRust製のパッケージマネージャーです。
Rust製で軽い&ロックファイルによる再現性の高さが特徴という点ではuvに似ていますが、conda-forge/PyPIを跨いだ環境構築が可能な点、Python以外のマルチ言語にも対応している点、タスクランナー機能が搭載されている点などはuvとの差別化点です。
以下公式の比較表です。

pixiのインストール
公式記載の通り、以下のコマンドでインストールできます。
# Linux & macOS
curl -fsSL https://pixi.sh/install.sh | sh
# HomebrewでもOK
brew install pixi
# Windows
powershell -ExecutionPolicy ByPass -c "irm -useb https://pixi.sh/install.ps1 | iex"
pixiのプロジェクト作成最短フロー
# 初期化
pixi init
# Pythonのインストール
pixi add python=3.11
# 任意のパッケージをインストール
pixi add pandas numpy
# requirements.txtの内容をpixi.tomlに追加
pixi import -f default requirements.txt
# pixi.tomlに記載した依存をインストール(※下記 pixi run でもパッケージのインストールが走るため必須ではない)
pixi install
# 実行(実行時に未インストールのパッケージがあれば自動でインストールしてくれる)
pixi run ~
以下が特にuvとは異なる点です。
- Pythonは
pixi addで他パッケージと同様に追加する -
pixi addに-rオプションがないため、requirements.txtの内容を一括でインストールできない- 一旦
pixi importで内容をpixi.tomlに追加しておいて、後でpixi installなどで一括インストールする
- 一旦
-
pixi runで未インストールのパッケージを自動でインストールして実行してくれる
タスクランナーについて
プロジェクトの検討段階では、長ったらしいコマンドを何度も実行しなければならないことがよくあります。そのような状況では、長いコマンドを短いワードにまとめておけるタスクランナー機能が非常に有用です。以下にpixiのタスクランナー機能の基本的な使い方をメモしておきます。
タスクの追加
pixi.tomlに以下のように記載することで、タスクを定義することができます。
[tasks]
test = "pytest"
lint = "ruff check ."
serve = "uvicorn app:app --reload"
コマンドでもタスクを定義することができます。
pixi task add start "python hello.py"
公式ドキュメントを見ると、コマンドがシンプルな場合はコマンド部分もクオートで囲まずそのまま入力している一方で、オプション引数が登場する場合や環境変数の指定を含める場合など複雑なコマンドを実行する際にはコマンド部分をクオートで囲んでいるようです。
が、普通に紛らわしいのでコマンド部分は全部クオートで囲っちゃうのがベターだと思います。
タスクの実行
pixi run <タスク名> を実行することで、定義したタスクを実行することができます。
pixi run start
その他主要コマンドまとめ
pyproject.toml の使用
pixi init 時に --format オプションで pyproject を指定することで、 pixi.toml ではなく pyproject.toml でパッケージ管理を行うことが可能です。
pixi init --format pyproject
--frozen および --locked オプション
pixi run などの各種コマンドに --frozen や --locked オプションをつけることで、
-
--frozen: lockに書いてある通りにインストールし、lockの更新は行わない -
--locked: lockがManifest(pixi.tomlやpyproject.toml)と一致している時のみインストールし、ズレがあったらエラーにする
とより厳密な環境管理が可能になります。
pixi install --frozen
pixi run --locked test
その他もろもろ
# 依存パッケージの削除
pixi remove <パッケージ>
# 環境に入っているパッケージ一覧を表示
pixi list
# 依存を範囲内で新しく更新
pixi update
# そのプロジェクトの環境に入ったシェルを開く
pixi shell
# タスク一覧の表示
pixi task list
さいごに
というわけで、pixiの使いどころとしては
- Python + 他言語のプロジェクト
- タスクランナーを使いたい場合
といったところでしょうか。
データサイエンティストとしては後者が特に嬉しいポイントなので、気分でuvと使い分けていこうかなと思います。
Discussion