From 30ffafb47d14fb905d0ca2345fe097903e9180e1 Mon Sep 17 00:00:00 2001 From: Florian Friesdorf Date: Sun, 22 Jul 2012 02:16:59 +0200 Subject: [PATCH] recursive pth loader --- .../recursive-pth-loader/default.nix | 20 ++++++++ .../recursive-pth-loader/sitecustomize.py | 46 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 6 +++ 3 files changed, 72 insertions(+) create mode 100644 pkgs/development/python-modules/recursive-pth-loader/default.nix create mode 100644 pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py diff --git a/pkgs/development/python-modules/recursive-pth-loader/default.nix b/pkgs/development/python-modules/recursive-pth-loader/default.nix new file mode 100644 index 000000000000..3452c62e2168 --- /dev/null +++ b/pkgs/development/python-modules/recursive-pth-loader/default.nix @@ -0,0 +1,20 @@ +{ stdenv, python }: + +stdenv.mkDerivation rec { + name = "resursive-pth-loader-1.0"; + + unpackPhase = "true"; + + buildInputs = [ python ]; + + installPhase = + '' + dst=$out/lib/${python.libPrefix}/site-packages + mkdir -p $dst + cat ${./sitecustomize.py} >> $dst/sitecustomize.py + ''; + + meta = { + description = "Enable recursive processing of pth files anywhere in sys.path"; + }; +} diff --git a/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py b/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py new file mode 100644 index 000000000000..057e779803cb --- /dev/null +++ b/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) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index b8327ddaaae4..f06a97aadc94 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -13,6 +13,12 @@ let pythonPackages = python.modules // rec { }; + recursivePthLoader = import ../development/python-modules/recursive-pth-loader { + inherit (pkgs) stdenv; + inherit python; + }; + + setuptools = import ../development/python-modules/setuptools { inherit (pkgs) stdenv fetchurl; inherit python wrapPython;