如何从源代码将包安装到 nix shell 中以使用 flakes 进行调试,相当于 python setup.pydevelop

问题描述 投票:0回答:2

有没有办法将包从源代码包含到nix shell中,即链接到实际源代码而不是nix存储中的代码副本的路径,以用于调试目的?

即我正在寻找相当于跑步的尼克斯片

python setup.py develop

在 conda 环境中而不是安装。

我发现最接近的是使用 flake.nix 之类的

{
    inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    outputs = { self, nixpkgs }:
    let
        pkgs = import nixpkgs { system = "x86_64-linux"; };
        python_library = pkgs.python3Packages.buildPythonPackage {
            pname = "python_library";
            version = "0.1";
            src = /home/user_name/python_library;
            doCheck = false;
        };
    in {
      defaultPackage.x86_64-linux = pkgs.buildEnv {
        name = "test-env";
        paths = [
          (pkgs.python3.withPackages(ps: [
            ps.numpy
            ps.scipy
            ps.matplotlib
            python_library
          ]))
          pkgs.spyder
        ];
      };
    };
}

其中

python_library
包含我希望调试的新代码,例如

class Hello:
  def __init__(self):
    print("Hello!!! Hello!")

我通过它进行测试

>>> from artiq_library.test import Hello
>>> a=Hello()
Hello!!! Hello!

为了使代码更改生效,我需要运行

nix build
nix shell

只要 flake 不在 git 存储库中,它就会使用更新的代码重建 nix 环境。然而,在更复杂的情况下,如果有很多错误需要修复,并且总是必须在 nix flake 和要执行的代码之间切换文件夹,那么这个重建过程可能会变得非常烦人,所以我想知道是否有一种方法可以编写以这样的方式进行切片,即 nix 存储直接链接到源代码,而不是像 anaconda 那样复制它?

nix develop
命令似乎都没有为我做类似的事情。

nix nixos
2个回答
0
投票

有几种不同的方法可以做到这一点,最好的方法可能取决于特定的包以及您想要如何访问源代码。

shell.nix:

let
  pkgs = import <nixpkgs> {};
in
  pkgs.mkShell {
    buildInputs = [ pkgs.python3 ];
    src1 = pkgs.python3.src;
    src2 = pkgs.fetchzip {
      url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
      hash = "sha256-JuAdS/B3YTTzkhtgvdY5ehutbDnYS5Q9E2GzafmV+jw=";
    };
    src3 = builtins.fetchTarball {
      url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
    };
  }
$ nix-shell
$ ls $src1
/nix/store/i17s0hxbiqzphgz72vr6jpvh4h2xa3cv-Python-3.10.13.tar.xz

$ ls $src2
aclocal.m4    configure     Grammar     Lib      Makefile.pre.in  Objects  PCbuild        Python
config.guess  configure.ac  Include     LICENSE  Misc             Parser   Programs       README.rst
config.sub    Doc           install-sh  Mac      Modules          PC       pyconfig.h.in  Tools

$ ls $src3
aclocal.m4    configure     Grammar     Lib      Makefile.pre.in  Objects  PCbuild        Python
config.guess  configure.ac  Include     LICENSE  Misc             Parser   Programs       README.rst
config.sub    Doc           install-sh  Mac      Modules          PC       pyconfig.h.in  Tools

0
投票

有几种不同的方法可以做到这一点,最好的方法可能取决于特定的包以及您想要访问源代码的方式。按照惯例,包通常有一个

src
属性,您可以访问它来获取其源代码的派生,但该派生可能会产生一个 tar 球(就像
python3.src
的情况一样),或者可能会生成该源代码的提取副本源代码。此外,
.src
属性通常不包含任何适用于源代码的补丁,这对您来说可能很重要。

shell.nix:

let
  pkgs = import <nixpkgs> {};
in
  pkgs.mkShell {
    buildInputs = [ pkgs.python3 ];
    src1 = pkgs.python3.src;
    src2 = pkgs.fetchzip {
      url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
      hash = "sha256-JuAdS/B3YTTzkhtgvdY5ehutbDnYS5Q9E2GzafmV+jw=";
    };
    src3 = builtins.fetchTarball {
      url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
    };
  }
$ nix-shell
$ ls $src1
/nix/store/i17s0hxbiqzphgz72vr6jpvh4h2xa3cv-Python-3.10.13.tar.xz

$ ls $src2
aclocal.m4    configure     Grammar     Lib      Makefile.pre.in  Objects  PCbuild        Python
config.guess  configure.ac  Include     LICENSE  Misc             Parser   Programs       README.rst
config.sub    Doc           install-sh  Mac      Modules          PC       pyconfig.h.in  Tools

$ ls $src3
aclocal.m4    configure     Grammar     Lib      Makefile.pre.in  Objects  PCbuild        Python
config.guess  configure.ac  Include     LICENSE  Misc             Parser   Programs       README.rst
config.sub    Doc           install-sh  Mac      Modules          PC       pyconfig.h.in  Tools
© www.soinside.com 2019 - 2024. All rights reserved.