前回の記事「宣言的パッケージ管理ツール「Nix」の概要と魅力」では、Nixの基本的な仕組みとメリットについて紹介しました。
今回はその実践編として、macOSにNixをインストールし、ローカル環境を一切汚さずに再現性の高いPython開発環境を構築する具体的な手順についてまとめました。
1. macOS上のPython環境でよくある課題
macOSでPythonの環境構築を行う際、以下のようなトラブルに遭遇したことはないでしょうか?
- OS標準のPythonを直接触ってしまい、システムのライブラリを破損させてしまった。
- HomebrewでインストールしたPythonが、Homebrew全体のアップデートに伴って意図せずマイナーバージョンアップされ、既存プロジェクトが動かなくなった。
- バージョン切り替えのために
pyenvやdirenv、仮想環境管理のためのpoetryやvenvなど、多くのツールを組み合わせる必要があり、設定が複雑化してしまった。
Nixを使えば、これらのバージョン管理ツールや仮想環境ツールを個別にインストールすることなく、プロジェクトごとの設定ファイル(shell.nix)を用意するだけで、クリーンで再現性の高い環境を即座に構築できます。
2. macOSへのNixのインストール
まずはmacOSにNix本体をインストールします。macOS(Apple Silicon/Intel)向けには、公式標準のインストーラーのほか、よりモダンで管理がしやすいDeterminate Systems提供のインストーラーを利用するのが現在のトレンドであり、最もおすすめです。
ターミナルを開き、以下のコマンドを実行します。
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
インストーラーを実行すると、セットアップウィザードが進行し、パスワードの入力を求められます。指示に従って進めてください。
インストールが完了したら、一度ターミナルを再起動するか、新しいタブを開いてインストールが成功しているか確認します。
nix --version
バージョン情報(例: nix (Nix) 2.22.1 など)が出力されれば、インストールは成功です。
3. Nixを使ったPython開発環境の構築
それでは、実際にmacOS環境に影響を与えないプロジェクト専用のPython環境を作っていきます。
3.1. プロジェクトディレクトリの作成
適当な作業用ディレクトリを作成して移動します。
mkdir nix-python-demo
cd nix-python-demo
3.2. shell.nix の作成
ディレクトリの中に、開発環境を定義する shell.nix ファイルを作成します。
今回は Python 3.11 を利用し、ライブラリ追加のための pip や仮想環境 virtualenv を同梱させます。さらに、シェル起動時に自動で仮想環境(.venv)を作成・有効化するスクリプトを記述した、実践的な設定例をご紹介します。
let
# 安定版のパッケージリポジトリを指定(ピン留め)
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/e35f72cf7b1a11fd9eb0155b93d7c50a58a74e0d.tar.gz") {};
in
pkgs.mkShell {
# 必要なパッケージをNixで管理
buildInputs = [
pkgs.python311
pkgs.python311Packages.pip
pkgs.python311Packages.virtualenv
];
# シェル起動時に実行されるスクリプト
shellHook = ''
# プロジェクトディレクトリ直下に .venv がない場合は作成
if [ ! -d ".venv" ]; then
echo "🔨 仮想環境(.venv)を作成しています..."
python -m venv .venv
fi
# 仮想環境を自動でアクティベート
source .venv/bin/activate
# pipを最新化
pip install --upgrade pip --quiet
echo "🐍 Python 3.11 開発環境が正常に有効化されました! (.venv)"
python --version
'';
}
3.3. 開発環境の起動
ファイルの保存後、ターミナルで以下のコマンドを実行します。
nix-shell
コマンドを叩くと、初回のみPython 3.11やパッケージのダウンロードが自動で行われ、その後 shellHook で定義したスクリプトが実行されます。
自動的に .venv 仮想環境が生成され、アクティベートされた状態でプロンプトが切り替われば完了です!
🔨 仮想環境(.venv)を作成しています...
🐍 Python 3.11 開発環境が正常に有効化されました! (.venv)
Python 3.11.8
(nix-python-demo) [ユーザー名]@[マシン名] nix-python-demo %
4. ライブラリのインストールと環境のクリーンさ
Nixによって作成されたシェル環境内(nix-shell 内)では、通常通り pip を使ってライブラリをインストールできます。
pip install requests
インストールされた requests ライブラリは、プロジェクトディレクトリ内の .venv 配下にのみ保存されます。
ここで、一度 Nixシェル から抜けてみましょう。
exit
元のシェルに戻った状態で python --version や pip list などを実行してみてください。
先ほどインストールした requests は見当たらず、PythonのバージョンもmacOS標準のもの(または以前からインストールされていたもの)に戻っているはずです。
このように、Nixの環境はローカルのグローバル環境と完全に隔離されており、プロジェクトのディレクトリを削除するだけで、PCを一切汚すことなく完璧に元の状態に片付けることができます。
5. まとめ
Nixを使用すれば、macOS環境で複雑になりがちなPythonのバージョン管理や仮想環境の競合問題を、shell.nix というたった1つのテキストファイルでシンプルに解決できます。
他のメンバーにプロジェクトを共有する際も、「Nixをインストールして nix-shell を叩いてください」と伝えるだけで、OSの違いやインストール済みツールの差を気にすることなく、全員がまったく同じPython環境で開発をスタートできます。
ローカル開発環境をよりクリーンに、より強固に保ちたい方は、ぜひNixでのPython環境構築を試してみてください。
今回はここまでです。
