如何用Nix Flake从源码引入包到Shell实现调试(等效python develop)
在Nix Flake中实现类似conda
python setup.py develop的源码调试方案 你需要的是让Nix Shell直接链接本地源码而非复制到Nix Store,修改代码后无需重新构建即可生效,以下是两种可行的Flake配置方案:
方案一:使用developPackage(推荐)
nixpkgs提供了python3Packages.developPackage,专门用于创建Python包的开发环境,它会直接链接本地源码,而非复制构建。
修改你的flake.nix如下:
{ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; outputs = { self, nixpkgs }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; # 使用developPackage替代buildPythonPackage python_library_dev = pkgs.python3Packages.developPackage { pname = "python_library"; version = "0.1"; src = ./python_library; # 用相对路径更灵活,也可以用绝对路径 doCheck = false; # 声明依赖,和buildPythonPackage一致 propagatedBuildInputs = with pkgs.python3Packages; [ numpy scipy matplotlib ]; }; in { # 配置devShell,直接进入开发环境 devShell.${system} = pkgs.mkShell { packages = [ python_library_dev pkgs.spyder ]; }; }; }
使用方式:
- 执行
nix develop进入环境 - 修改本地
python_library目录下的代码后,直接在Python中导入测试,无需重新构建
方案二:手动设置PYTHONPATH
如果不需要额外的构建逻辑,也可以直接在devShell中把本地源码目录加入Python的搜索路径,完全跳过Nix的包构建流程:
{ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; outputs = { self, nixpkgs }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; # 基础Python环境,包含所需依赖 python_env = pkgs.python3.withPackages(ps: [ ps.numpy ps.scipy ps.matplotlib ]); in { devShell.${system} = pkgs.mkShell { packages = [ python_env pkgs.spyder ]; # 将本地源码目录加入PYTHONPATH shellHook = '' export PYTHONPATH="${./python_library}:$PYTHONPATH" ''; }; }; }
使用方式和方案一一致,进入nix develop后,修改源码立即生效。
说明
- 方案一的
developPackage会处理包的依赖、entry points等,更接近正式构建环境,适合需要完整开发流程的场景 - 方案二更轻量化,适合快速调试简单包,无需处理Nix包构建的细节
内容的提问来源于stack exchange,提问作者Vera
相关产品推荐
相关产品推荐

