summary refs log tree commit diff
diff options
context:
space:
mode:
authorDomen Kožar <domen@dev.si>2015-08-18 13:09:04 +0200
committerDomen Kožar <domen@dev.si>2015-08-18 13:09:04 +0200
commitf044c311748a6e4938f8b9b8bcaba85ef6d22fe7 (patch)
tree0901dce26156db560c054b8e855ad79cbb14226d
parent3409dc7fe820aca231caa5058ef7448af0046984 (diff)
parent344e5221664a8c232c3b2b0c7667dcd4c229834f (diff)
downloadnixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.tar
nixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.tar.gz
nixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.tar.bz2
nixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.tar.lz
nixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.tar.xz
nixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.tar.zst
nixlib-f044c311748a6e4938f8b9b8bcaba85ef6d22fe7.zip
Merge pull request #9298 from abbradar/python-env
python: add .env for convenient nix-shell's
-rw-r--r--doc/language-support.xml21
-rw-r--r--pkgs/development/interpreters/python/wrapper.nix54
2 files changed, 54 insertions, 21 deletions
diff --git a/doc/language-support.xml b/doc/language-support.xml
index 9117af864add..a969111ed77c 100644
--- a/doc/language-support.xml
+++ b/doc/language-support.xml
@@ -464,6 +464,27 @@ python.buildEnv.override {
     with wrapped binaries in <filename>bin/</filename>.
   </para>
 
+  <para>
+  You can also use <varname>env</varname> attribute to create local
+  environments with needed packages installed (somewhat comparable to
+  <literal>virtualenv</literal>). For example, with the following
+  <filename>shell.nix</filename>:
+
+<programlisting language="nix">
+<![CDATA[with import <nixpkgs> {};
+
+(python3.buildEnv.override {
+  extraLibs = with python3Packages;
+    [ numpy
+      requests
+    ];
+}).env]]>
+</programlisting>
+
+  Running <command>nix-shell</command> will drop you into a shell where
+  <command>python</command> will have specified packages in its path.
+  </para>
+
   <variablelist>
     <title>
       <function>python.buildEnv</function> arguments
diff --git a/pkgs/development/interpreters/python/wrapper.nix b/pkgs/development/interpreters/python/wrapper.nix
index 163e8d7194ba..f757147b0475 100644
--- a/pkgs/development/interpreters/python/wrapper.nix
+++ b/pkgs/development/interpreters/python/wrapper.nix
@@ -6,28 +6,40 @@
 # Create a python executable that knows about additional packages.
 let
   recursivePthLoader = import ../../python-modules/recursive-pth-loader/default.nix { stdenv = stdenv; python = python; };
-in
-(buildEnv {
-  name = "${python.name}-env";
-  paths = stdenv.lib.filter (x : x ? pythonPath) (stdenv.lib.closePropagation extraLibs) ++ [ python recursivePthLoader ];
+  env = (buildEnv {
+    name = "${python.name}-env";
+    paths = stdenv.lib.filter (x : x ? pythonPath) (stdenv.lib.closePropagation extraLibs) ++ [ python recursivePthLoader ];
 
-  inherit ignoreCollisions;
+    inherit ignoreCollisions;
 
-  postBuild = ''
-    . "${makeWrapper}/nix-support/setup-hook"
+    postBuild = ''
+      . "${makeWrapper}/nix-support/setup-hook"
 
-    if [ -L "$out/bin" ]; then
-        unlink "$out/bin"
-    fi
-    mkdir -p "$out/bin"
+      if [ -L "$out/bin" ]; then
+          unlink "$out/bin"
+      fi
+      mkdir -p "$out/bin"
 
-    cd "${python}/bin"
-    for prg in *; do
-      rm -f "$out/bin/$prg"
-      makeWrapper "${python}/bin/$prg" "$out/bin/$prg" --set PYTHONHOME "$out"
-    done
-  '' + postBuild;
-}) // {
-  inherit python;
-  inherit (python) meta;
-}
+      cd "${python}/bin"
+      for prg in *; do
+        rm -f "$out/bin/$prg"
+        makeWrapper "${python}/bin/$prg" "$out/bin/$prg" --set PYTHONHOME "$out"
+      done
+    '' + postBuild;
+
+    passthru.env = stdenv.mkDerivation {
+      name = "interactive-${python.name}-environment";
+      nativeBuildInputs = [ env ];
+
+      buildCommand = ''
+        echo >&2 ""
+        echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
+        echo >&2 ""
+        exit 1
+      '';
+    };
+  }) // {
+    inherit python;
+    inherit (python) meta;
+  };
+in env