From 80c90c03aec709c09abbb1462073fc33bb5f110c Mon Sep 17 00:00:00 2001 From: Daniel Fainberg Date: Wed, 8 Jul 2026 14:32:05 +0200 Subject: [PATCH] feat(python): manage python with uv via nix-ld --- modules/home.nix | 15 +++++++++++++++ modules/nixos.nix | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/modules/home.nix b/modules/home.nix index c8a4d5c..cb357ec 100644 --- a/modules/home.nix +++ b/modules/home.nix @@ -89,6 +89,10 @@ in PYTHONIOENCODING = "UTF-8"; PYTHONSTARTUP = "${config.xdg.configHome}/python/startup"; PYTHON_HISTFILE = "${config.xdg.cacheHome}/python/history"; + # Default interpreter uv picks for `uv run`/`uv venv` without an explicit + # -p. Pins throwaway REPLs and new projects to one version across machines + # (further steered by uv.toml below). Fetched on demand by uv, not Nix. + UV_PYTHON = "3.14"; # psql / wget / readline configs, XDG-routed (the rc files are declared # via xdg.configFile below). PSQLRC = "${config.xdg.configHome}/psql/rc"; @@ -123,6 +127,8 @@ in # finalPackage) — do NOT also list it here, or buildEnv conflicts on the # wrapper binary. nodejs + uv # Python: versions, venvs, deps, lockfile. Runs uv-managed + # standalone CPython via nix-ld (see modules/nixos.nix). highlight # `ccat` alias: syntax-highlighted cat jq # JSON on the command line (scripts, ad-hoc inspection) libreoffice @@ -144,6 +150,13 @@ in xdg.configFile = { "python/startup".source = ./assets/python-startup.py; + # uv global config. "managed" = always use uv's own CPython, never a + # system/Nix python — keeps behaviour reproducible regardless of what else + # is on PATH. Default version comes from UV_PYTHON above. + "uv/uv.toml".text = '' + python-preference = "managed" + ''; + # psql: unlimited, per-database history file (kept out of $HOME). "psql/rc".text = '' \set HISTFILE ${config.xdg.cacheHome}/psql/history-:DBNAME @@ -325,6 +338,8 @@ in g = "git"; e = editor; v = editor; + # Throwaway REPL/scripts as if `python` were global; resolves to UV_PYTHON. + python = "uv run python"; }; # Interactive bits with no first-class HM option: prompt, autocd, diff --git a/modules/nixos.nix b/modules/nixos.nix index 85d8006..0616f1d 100644 --- a/modules/nixos.nix +++ b/modules/nixos.nix @@ -54,6 +54,23 @@ programs.hyprland.enable = true; programs.dconf.enable = true; + # nix-ld: install a stub dynamic linker at the standard FHS path + # (/lib64/ld-linux-*.so), which NixOS otherwise lacks. Lets unpatched + # prebuilt binaries run — notably the standalone CPython builds uv downloads + # and pip wheels with compiled extensions (numpy, pydantic-core, ...). The + # libraries list is exposed as NIX_LD_LIBRARY_PATH so those binaries find + # common shared libs; extend it when an import fails with "libFOO.so.N: cannot + # open shared object file". + programs.nix-ld = { + enable = true; + libraries = with pkgs; [ + stdenv.cc.cc.lib # libstdc++, libgcc_s, libgomp + zlib # libz + zstd # libzstd (pyarrow, polars) + openssl # libssl, libcrypto + ]; + }; + # Packages installed in system profile. environment.systemPackages = with pkgs; [ curl