about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/python-modules/recursive-pth-loader
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/python-modules/recursive-pth-loader')
-rw-r--r--nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py46
2 files changed, 72 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix
new file mode 100644
index 000000000000..359b482a1682
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, python }:
+
+stdenv.mkDerivation rec {
+  pname = "python-recursive-pth-loader";
+  version = "1.0";
+  name = pname + "-" + version;
+
+  unpackPhase = "true";
+
+  buildInputs = [ python ];
+
+  patchPhase = "cat ${./sitecustomize.py} > sitecustomize.py";
+
+  buildPhase = "${python}/bin/${python.executable} -m compileall .";
+
+  installPhase =
+    ''
+      dst=$out/lib/${python.libPrefix}/site-packages
+      mkdir -p $dst
+      cp sitecustomize.* $dst/
+    '';
+
+  meta = {
+      description = "Enable recursive processing of pth files anywhere in sys.path";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py
new file mode 100644
index 000000000000..057e779803cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py
@@ -0,0 +1,46 @@
+"""Recursively load pth files in site-packages of sys.path
+
+- iterate over sys.path
+- check for pth in dirs that end in site-packages
+- ignore import statements in pth files
+- add dirs listed in pth files right after current sys.path element,
+  they will be processed in next iteration
+"""
+
+import os
+import site
+import sys
+
+
+for path_idx, sitedir in enumerate(sys.path):
+    # ignore non-site-packages
+    if not sitedir.endswith('site-packages'):
+        continue
+
+    # find pth files
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        continue
+    dotpth = os.extsep + "pth"
+    pths = [name for name in names if name.endswith(dotpth)]
+
+    for pth in pths:
+        fullname = os.path.join(sitedir, pth)
+        try:
+            f = open(fullname, "rU")
+        except IOError:
+            continue
+
+        with f:
+            for n, line in enumerate(f):
+                if line.startswith("#"):
+                    continue
+
+                if line.startswith(("import ", "import\t")):
+                    continue
+
+                line = line.rstrip()
+                dir, dircase = site.makepath(sitedir, line)
+                if not dircase in sys.path:
+                    sys.path.insert(path_idx+1, dir)