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

时间:2017-05-07 23:13:16

标签: nix

我有一个名为myscript.py的Python脚本,并希望将其打包为nix派生mkDerivation

唯一的要求是我的Python脚本对consul Python库(它本身依赖于requestssix Python库)具有运行时依赖性。

例如myscript.py

#!/usr/bin/env python3

import consul
print('hi')

怎么做?

我无法弄清楚如何传递mkDerivation单个脚本(其src似乎总是想要一个目录,或fetchgit或类似),也可以&# 39;弄清楚如何在运行时使依赖库可用。

2 个答案:

答案 0 :(得分:3)

如果您的脚本只有一个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
  '';
};

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

如果你使用NixOS,你也可以把你的包放到environment.systemPackages,{N}在shell上可以使用myscript

答案 1 :(得分:0)

这个辅助函数真的很好:

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)
''

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