blog.anqou.net
rss
author
tags

Nix Flake で再現可能でシンプルな Python 開発環境を作る

Nix Flake は再現可能な開発環境を作るのに便利ですが、ドキュメントを見てもどのように使えばいいのか初見ではよく分かりません。そこで、Python コードを書くためのシンプルな開発環境を作ってみます。ここに書く例はシンプルすぎて本格的な開発には向きません[1]が、適当に書いたアドホックなスクリプトを塩漬けにするには便利に使えます。なお Nix がインストールされていることは前提とします。

とりあえずテンプレートを作成するために nix flake init を打ちます。すると flake.nix のスケルトンが生成されます:

$ nix flake init
wrote: "/home/anqou/workspace/test-python/flake.nix"

$ ls
flake.nix

$ cat flake.nix
{
  description = "A very basic flake";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  };

  outputs = { self, nixpkgs }: {

    packages.x86_64-linux.hello = nixpkgs.legacyPackages.x86_64-linux.hello;

    packages.x86_64-linux.default = self.packages.x86_64-linux.hello;

  };
}

この状況で nix develop と打つと開発環境に入れます。ただし現状は何もインストールされていません:

$ nix develop
warning: creating lock file "/home/anqou/workspace/test-python/flake.lock":
• Added input 'nixpkgs':
    'github:nixos/nixpkgs/b12141ef619e0a9c1c84dc8c684040326f27cdcc?narHash=sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24%3D' (2026-04-18)

[anqou@anise:~/workspace/test-python]$ python -V
Python 3.13.12 # 開発環境の外側にある Python が見えている

[anqou@anise:~/workspace/test-python]$ # C^D で抜ける

一旦抜けて flake.nix を以下のように書き換え、Python をインストールします:

{
  description = "A very basic flake";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  };

  outputs = {
    self,
    nixpkgs,
  }: let
    system = "x86_64-linux";
    pkgs = nixpkgs.legacyPackages.${system};
  in {
    # devShells を定義することで nix develop の環境に
    # 何を持ち込むかを指定できる。
    devShells.${system}.default = pkgs.mkShell {
      buildInputs = with pkgs; [
        python314
      ];
    };
  };
}

再び nix develop すると Python 3.14.3 が入っていることがわかります:

$ nix develop

[anqou@anise:~/workspace/test-python]$ python -V
Python 3.14.3

[anqou@anise:~/workspace/test-python]$

毎回 nix develop するのは面倒なので direnv を設定しておきます:

$ echo "use flake" > .envrc
direnv: error /home/anqou/workspace/test-python/.envrc is blocked. Run `direnv allow` to approve its content

$ direnv allow
direnv: loading ~/workspace/test-python/.envrc
direnv: using flake
direnv: nix-direnv: Renewed cache
direnv: export +AR +AS +CC +CONFIG_SHELL +CXX +DETERMINISTIC_BUILD +HOST_PATH +IN_NIX_SHELL +LD +NIX_BINTOOLS +NIX_BINTOOLS_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu +NIX_BUILD_CORES +NIX_CC +NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu +NIX_CFLAGS_COMPILE +NIX_ENFORCE_NO_NATIVE +NIX_HARDENING_ENABLE +NIX_LDFLAGS +NIX_STORE +NM +OBJCOPY +OBJDUMP +PYTHONHASHSEED +PYTHONPATH +RANLIB +READELF +SIZE +SOURCE_DATE_EPOCH +STRINGS +STRIP +_PYTHON_HOST_PLATFORM +_PYTHON_SYSCONFIGDATA_NAME +__structuredAttrs +buildInputs +buildPhase +builder +cmakeFlags +configureFlags +depsBuildBuild +depsBuildBuildPropagated +depsBuildTarget +depsBuildTargetPropagated +depsHostHost +depsHostHostPropagated +depsTargetTarget +depsTargetTargetPropagated +doCheck +doInstallCheck +dontAddDisableDepTrack +mesonFlags +name +nativeBuildInputs +out +outputs +patches +phases +preferLocalBuild +propagatedBuildInputs +propagatedNativeBuildInputs +shell +shellHook +stdenv +strictDeps +system ~PATH ~PYTHONNOUSERSITE ~XDG_DATA_DIRS

$ python -V
Python 3.14.3 # nix develop せずとも devShells の中身が使える。

これで適当なファイルを書いて Python で実行することができるようになりました。

さて、Python はサードパーティ製のライブラリを使うことで初めて真価を発揮します[要出典]。この環境でライブラリを使いたい場合、pip ではなく[2] flake.nix に直接指定します。例えば NumPy を使いたい場合は次のようにします:

    devShells.${system}.default = pkgs.mkShell {
      buildInputs = with pkgs; [
        python314
        python314Packages.numpy # この行を追加
      ];
    };

これで NumPy が使えるようになります:

$ python
Python 3.14.3 (main, Feb  3 2026, 15:32:20) [GCC 15.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.__version__
'2.4.2'
>>>

どんなライブラリが使えるかは NixOS Search から調べることができます。使いたいライブラリが存在しない場合は buildPythonPackage を使い手元に追加して使うことができます。詳細は Official NixOS Wiki を見てください。

注釈

  1. 本格的に使うなら(ここに流行っている Python のパッケージマネージャを書く)を Nix Flake 経由で使う仕組みを使ってください。

  2. そもそも pip は入っていません。