如何使用 nix 打包单个 Python 脚本?

nh2*_*nh2 5 nix

我叫一个Python脚本myscript.py,并想将它打包了一个nix与推导mkDerivation

唯一的要求是我的 Python 脚本有一个运行时依赖项,比如说,对于consulPython 库(它本身依赖于requestssixPython 库)。

例如对于myscript.py

#!/usr/bin/env python3

import consul
print('hi')
Run Code Online (Sandbox Code Playgroud)

怎么做?

我不知道如何传递mkDerivation单个脚本(它src似乎总是需要一个目录fetchgit或类似的),也无法弄清楚如何在运行时使依赖库可用。

nh2*_*nh2 11

当你有一个 Python 文件作为你的脚本时,你不需要src,你mkDerivation也不需要解压任何源代码。

默认mkDerivation会尝试解压你的源代码;为了防止这种情况,只需设置unpackPhase = "true";(这是/bin/true,什么都不做的程序)。

myscript-package = pkgs.stdenv.mkDerivation {
  name = "myscript";
  buildInputs = [
    (pkgs.python36.withPackages (pythonPackages: with pythonPackages; [
      consul
      six
      requests2
    ]))
  ];
  unpackPhase = "true";
  installPhase = ''
    mkdir -p $out/bin
    cp ${./myscript.py} $out/bin/myscript
    chmod +x $out/bin/myscript
  '';
};
Run Code Online (Sandbox Code Playgroud)

如果您的脚本是可执行的(我们在chmod +x上面确保)nix将自动将您的#!/usr/bin/env python3行替换为调用正确的特定 python 解释器的行(python36上面示例中的那个),并且在具有 Python 包的环境中执行此操作已在buildInputs可用中指定。

如果您使用 NixOS,那么您还可以将您的包放入environment.systemPackages,并且myscript将在该 NixOS 上的 shell 中可用。


小智 9

这个辅助函数非常好:

pkgs.writers.writePython3Bin "github-owner-repos" { libraries = [ pkgs.python3Packages.PyGithub ]; } ''
 import os
 import sys
 from github import Github

 if __name__ == '__main__':
     gh = Github(os.environ['GITHUB_TOKEN'])

     for repo in gh.get_user(login=sys.argv[1]).get_repos():
         print(repo.ssh_url)
''
Run Code Online (Sandbox Code Playgroud)

https://github.com/nixos/nixpkgs/blob/master/pkgs/build-support/writers/default.nix#L319