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

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

我有一个名为

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

唯一的要求是我的 Python 脚本具有运行时依赖项,例如

consul
Python 库(它本身依赖于
requests
six
Python 库)。

例如

myscript.py

#!/usr/bin/env python3

import consul
print('hi')

如何做到这一点?

我不知道如何传递

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

nix
2个回答
22
投票

当您使用单个 Python 文件作为脚本时,您的

src
中不需要
mkDerivation
,也不需要解压任何源代码。

默认

mkDerivation
将尝试解压您的源代码;为了防止这种情况,只需设置
dontUnpack = true

myscript-package = pkgs.stdenv.mkDerivation {
  name = "myscript";
  propagatedBuildInputs = [
    (pkgs.python3.withPackages (pythonPackages: with pythonPackages; [
      consul
      six
      requests2
    ]))
  ];
  dontUnpack = true;
  installPhase = "install -Dm755 ${./myscript.py} $out/bin/myscript";
};

如果您的脚本是可执行的(我们通过上面的

install -m
确保这一点),Nix 将自动将您的
#!/usr/bin/env python3
行替换为调用正确的特定 python 解释器的行(上例中用于
python36
的行),并且因此,在具有您在
propagatedBuildInputs
中指定的 Python 包的环境中可用。

如果您使用 NixOS,您也可以将包放入

environment.systemPackages
,并且
myscript
将在该 NixOS 的 shell 中可用。


10
投票

这个辅助功能非常好:

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

© www.soinside.com 2019 - 2024. All rights reserved.