📘

【Python】Pixiの環境(environment)

に公開

Pixiに於ける環境の基本

Pixiに於ける環境とは、Pythonの仮想環境に程近い概念であると言えよう。

pipを例にした環境の違い
PS C:\\sample> pip --version
pip 25.1.1 from C:\Users\\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\pip (python 3.13)
PS C:\\sample> pixi run pip --version
pip 25.2 from C:\\sample\.pixi\envs\default\Lib\site-packages\pip (python 3.13)

しかしPythonそれと大きく異なる点は、「複数であっても容易に扱える」ところであろう。

複数の環境

まずはPixiでワークスペースを一つ新たに作る。

environmentsの名で作った
pixi init environments

environmentsというフォルダーの中に、pixi.tomlというファイルがあるだろう。環境にまつわる内容は、このファイルに記載していく。

本記事で扱う内容

本記事では、次のpixi.tomlを使う。これらの意味は、実行の結果を見ればすぐに分かるだろう。

なおWindowsで実行したためplatforms = ["win-64"]とあるが、OSによって適切なものが自動的に設定されているはずである。

pixi.toml
[workspace]
channels = ["conda-forge"]
name = "environments"
platforms = ["win-64"] # OSによって異なる
version = "0.1.0"

[tasks]
show_version = "python --version"

[environments]
default = { features = ["py313"] }
py312 = { features = ["py312"] }
py311 = { features = ["py311"] }
py310 = { features = ["py310"], solve-group = "group310", no-default-feature = true }
test310 = { features = ["test310", "py310"], solve-group = "group310", no-default-feature = true }

[feature.py313]
dependencies = { python = "~=3.13.0" }
# tasks = { show_version = "python --version" }

[feature.py312]
dependencies = { python = "~=3.12.0" }
# tasks = { show_version = "python --version" }

[feature.py311]
dependencies = { python = "~=3.11.0" }
# tasks = { show_version = "python --version" }

[feature.py310]
dependencies = { python = "~=3.10.0" }
tasks = { _show_version = "python --version" }

[feature.test310]
tasks = { print_version = "python -c \"import sys; print(sys.version)\"" }

環境について表にまとめると斯様になる。後述するように、no-default-feature = trueとしない環境には、暗黙の内にdefaultというfeatureが付される。

environments features solve-group
default py313
default
py312 py312
default
py311 py311
default
py310 py310 group310
test310 test310
py310
group310

1. 環境の使い分け

今、pixi.tomlにてshow_versionというタスクを定めている。これは、単にPythonのバージョンを表示するものである。

[tasks]
show_version = "python --version"

defaultpy312py311の各環境を用いてこのタスクを実行してみよう。オプション-e--environmentと同じく、使用する環境を示す。

pixi run -e 環境名 タスク名
PS C:\\environments> pixi run -e default show_version
Pixi task (show_version in default): python --version
Python 3.13.7
PS C:\\environments> pixi run -e py312 show_version
Pixi task (show_version in py312): python --version
Python 3.12.11
PS C:\\environments> pixi run -e py311 show_version
Pixi task (show_version in py311): python --version
Python 3.11.13

同名のshow_versionというタスクであるが、その結果は環境によって異なることが確かめられた。

ところで、このような状態を曖昧(ambiguous)であるといい、環境を指定するオプション-eを付けない場合、次のように表示される。

PS C:\\environments> pixi run show_version
? The task 'show_version' can be run in multiple environments.

Please select an environment to run the task in: ›
❯ default
  py312
  py311

これを見れば、選択肢にpy310がない。つまり、環境py310ではタスクshow_versionが使えないことを意味する。

2. no-default-featureによる独立

環境py310は「no-default-feature = trueと定めているため」、タスクshow_versionは使えない。

PS C:\\environments> pixi run -e py310 show_version
show_version: command not found

default:暗黙の帰属

show_versionpixi.tomlにて次のように定めている。

[tasks]
show_version = "python --version"

このように定められたものは、「defaultというfeatureに属する」。

defaultからの離脱

通常、全ての環境は「暗黙の内にdefaultというfeatureが付される」。従って、[tasks]などと定めたものが憑き纏うようになっている。この依存関係から離脱し、真に独立した環境を作る場合、no-default-feature = trueとするのである。

py310 = { features = ["py310"], solve-group = "group310", no-default-feature = true }

featureの明記

defaultとは異なるfeatureの定義は、次のように明記する。

py310の定義
[feature.py310]
dependencies = { python = "~=3.10.0" }
tasks = { _show_version = "python --version" }

先の通り環境py310には、このfeaturepy310を付している。これにより、タスク_show_versionが使えるようになる。

PS C:\\environments> pixi run -e py310 _show_version
Pixi task (_show_version in py310): python --version
Python 3.10.18

3. グループによる依存関係の同時解決

グループを使うと、複数の環境が同時に依存関係を解決し、バージョンの一致が保証されるという。公式には、「本番環境とテスト環境」といった使い方を想定しているようであった。

PS C:\\environments> pixi run -e py310 _show_version
Pixi task (_show_version in py310): python --version
Python 3.10.18
PS C:\\environments> pixi run print_version
Pixi task (print_version in test310): python -c "import sys; print(sys.version)"
3.10.18 | packaged by conda-forge | (main, Jun  4 2025, 14:42:04) [MSC v.1943 64 bit (AMD64)]

参考元

https://pixi.sh/latest/workspace/multi_environment/

Discussion