如何定义默认为 Python 3.5 的 Nix 环境

How can I define a Nix environment that defaults to Python 3.5

我在 default.nix 中定义了以下环境:

with import <nixpkgs> {};
stdenv.mkDerivation rec {
  name = "env";
  env = buildEnv { name = name; paths = buildInputs; };
  buildInputs = [
    python35
    python35Packages.pyyaml
  ];
}

如果我 运行 nix-shellpython 仍将是系统 python 在 /usr/bin/python (运行ning 在 Ubuntu) 而 python3 是 Nix 安装的 Python 3.5 二进制文件的符号链接。有没有办法定义环境,使 python 指向 Nix Python 3.5?

一个简单的解决方案是向您的环境添加一个 shell 挂钩,以定义从 pythonpython3 的别名。此别名仅在您 运行 nix-shell:

时有效
with import <nixpkgs> {};
stdenv.mkDerivation rec {
  name = "env";
  env = buildEnv { name = name; paths = buildInputs; };
  buildInputs = [
    python35
    python35Packages.pyyaml
  ];
  # Customizable development shell setup
  shellHook = ''
    alias python='python3'
  '';
}

您可以使用 runCommand 创建仅包含 python 符号链接的新派生。

with import <nixpkgs> {};
stdenv.mkDerivation rec {
  name = "env";
  env = buildEnv { name = name; paths = buildInputs; };
  buildInputs = [
    (runCommand "python-alias" {} ''
      mkdir -p $out/bin
      ln -s ${python35}/bin/python3 $out/bin/python
    '')
    python35
    python35Packages.pyyaml
  ];
}


nix-shell --pure --run 'python --version'
Python 3.5.3