2017-05-07 52 views
2

我有一个叫做myscript.py的Python脚本,并且想用mkDerivation将它打包为nix派生。如何打包一个Python脚本与nix?

唯一的要求是,我的Python脚本对于Python库(它本身取决于requestssix Python库)具有运行时相关性,例如consul

例如,对于myscript.py

#!/usr/bin/env python3 

import consul 
print('hi') 

如何做到这一点?

我无法弄清楚如何通过mkDerivation一个脚本(其src似乎总是希望有一个目录,或fetchgit或类似),也无法弄清楚如何使在运行时可用的依赖库。

回答

1

当你有一个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 
    ''; 
}; 

nix会自动将其中一个调用权的具体Python解释器(一个在上面的例子中python36),并且在有你specifified的Python包的环境下这样做替换您的#!/usr/bin/env python3线在buildInputs可用。

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

相关问题