0

我用未合并的补丁定义了一个自定义的 nix cpython 派生。如果我将它指定为目标,nix-shell 会给我我期望的版本。

{ pkgs ? import <nixpkgs> {} }:
(pkgs.python3.overrideAttrs (old:  {
    src = pkgs.fetchFromGitHub {
      owner = "bergkvist";
      repo = "cpython";
      rev = "01bcf2bef5f4ffffb454da35cb66b186a7a12598";
      sha256 = "1713sx5izd745bgr6fdx6d1g7ivaqy6jrf9v5jgml31bd1nmfccy";
    };
    verions = "3.11.5";
 })) })).override {
    sourceVersion = {major = "3"; minor = "11" ; patch = "5"; suffix = ""; };
  };

$ nix-shell
$ python
Python 3.11.0a0 (default, Aug  4 2021, 00:12:31) [Clang 7.1.0 (tags/RELEASE_710/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

但我没有看到如何将新的 cpython 用于现有包的方法。直接叠加不会影响任何事情。

{ pkgs ? import <nixpkgs> {} }:
let myPatchedPython = ... ;
    myPkgs = pkgs.extend(self: super: {
      python3 = myPatchedPython;
      python39 = myPatchedPython;
    });
in myPkgs.python39Packages.send2trash
$ nix-shell
$ python3 
Python 3.9.5 (default, Jul 18 2021, 14:31:15)

我注意到我可以使用覆盖,但它仅适用于运行时并且不适用于所有包。

let  useMyPy = drv: drv.override {
    python = myPatchedPython;
    python3 = myPatchedPython;
    python38 = myPatchedPython;
    python39 = myPatchedPython;
  };
pyobjc-core = useMyPy (pkgs.python39Packages.buildPythonPackage rec {
    pname = "pyobjc-core";
    version = "7.3";
    adfasdf = true;
    name = "${pname}-${version}";
    src = pkgs.python39Packages.fetchPypi {
      pname = "pyobjc-core";
      inherit version;
      sha256 = "0x3msrzvcszlmladdpl64s48l52fwk4xlnnri8daq2mliggsx0ah";
    };
 propagatedBuildInputs = [
      myPatchedPython
      pkgs.darwin.libobjc
      pkgs.darwin.cctools
      pkgs.darwin.apple_sdk.frameworks.Foundation
      pkgs.darwin.apple_sdk.frameworks.AppKit
      pkgs.darwin.apple_sdk.frameworks.CoreServices
      pkgs.darwin.apple_sdk.frameworks.Cocoa
      pkgs.python39Packages.setuptools
    ];
    buildInputs = [ pkgs.libffi ];
  });

in pyobjc-core
$ nix-shell
$ python3
Python 3.11.0a0 (default, Aug  4 2021, 00:12:31) [Clang 7.1.0 (tags/RELEASE_710/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import import AppKit
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/nix/store/jcc0xf3zwxnzzh497nip7v57k68r4zb9-python3.9-pyobjc-7.3/lib/python3.9/site-packages/AppKit/__init__.py", line 10, in <module>
    import Foundation
    ^^^^^^^^^^^^^^^^^
...
4

1 回答 1

0

AFAIK,执行此操作的官方方法是在nixpkgs (in ) 的覆盖~/.config/nixpkgs/overlays.nix中定义 myPatchedPython ,并像这样调用 nix-shell:

nix-shell -p myPatchedPython

如果这样不行,你也可以试试nix-shell -E '(import <nixpkgs> {}).myPatchedPython'之类的,给你更多的调试角度。

我过去成功使用的更迂腐的方法(没有覆盖)是直接在shell.nix 文件中复制或包含修补的 Python 版本,例如:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = [
    pkgs.python.overrideAttrs { ... }
  ];
}
于 2021-08-06T17:24:30.250 回答