1{ stdenv, python, buildEnv, makeWrapper
2, extraLibs ? []
3, extraOutputsToInstall ? []
4, postBuild ? ""
5, ignoreCollisions ? false
6, permitUserSite ? false
7, requiredPythonModules
8# Wrap executables with the given argument.
9, makeWrapperArgs ? []
10, }:
11
12# Create a python executable that knows about additional packages.
13let
14 env = let
15 paths = requiredPythonModules (extraLibs ++ [ python ] ) ;
16 pythonPath = "${placeholder "out"}/${python.sitePackages}";
17 pythonExecutable = "${placeholder "out"}/bin/${python.executable}";
18 in buildEnv {
19 name = "${python.name}-env";
20
21 inherit paths;
22 inherit ignoreCollisions;
23 extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall;
24
25 postBuild = ''
26 . "${makeWrapper}/nix-support/setup-hook"
27
28 if [ -L "$out/bin" ]; then
29 unlink "$out/bin"
30 fi
31 mkdir -p "$out/bin"
32
33 for path in ${stdenv.lib.concatStringsSep " " paths}; do
34 if [ -d "$path/bin" ]; then
35 cd "$path/bin"
36 for prg in *; do
37 if [ -f "$prg" ]; then
38 rm -f "$out/bin/$prg"
39 if [ -x "$prg" ]; then
40 makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set NIX_PYTHONPREFIX "$out" --set NIX_PYTHONEXECUTABLE ${pythonExecutable} --set NIX_PYTHONPATH ${pythonPath} ${if permitUserSite then "" else ''--set PYTHONNOUSERSITE "true"''} ${stdenv.lib.concatStringsSep " " makeWrapperArgs}
41 fi
42 fi
43 done
44 fi
45 done
46 '' + postBuild;
47
48 inherit (python) meta;
49
50 passthru = python.passthru // {
51 interpreter = "${env}/bin/${python.executable}";
52 inherit python;
53 env = stdenv.mkDerivation {
54 name = "interactive-${python.name}-environment";
55 nativeBuildInputs = [ env ];
56
57 buildCommand = ''
58 echo >&2 ""
59 echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
60 echo >&2 ""
61 exit 1
62 '';
63 };
64 };
65 };
66in env