python site.py that loads pth files anywhere on PYTHONPATH

This file is normally created by easy_install / distutils, but removed
and packaged separately to avoid collisions and allow for more use cases.

svn path=/nixpkgs/branches/stdenv-updates/; revision=32579
This commit is contained in:
Florian Friesdorf 2012-02-26 17:22:55 +00:00
parent be815e7639
commit cb1009a3fb
3 changed files with 121 additions and 0 deletions

View File

@ -0,0 +1,33 @@
{ stdenv, python }:
stdenv.mkDerivation rec {
name = "site-1.0";
unpackPhase = "true";
buildInputs = [ python ];
installPhase =
''
dst=$out/lib/${python.libPrefix}/site-packages
mkdir -p $dst
cat ${./site.py} >> $dst/site.py
'';
meta = {
description = "Enable processing of pth files anywhere in PYTHONPATH";
longDescription = ''
This file is normally created by easy_install / distutils in
site-packages and overrides python's default site.py. It adds
all parts of PYTHONPATH as site directories, which means pth
files are processed in them. We remove the normally created
site.py's and package it separately instead as it would cause
collisions.
For each module we have a pth file listing the module and all
its dependencies and we include python-site into the
PYTHONPATH of wrapped python programs so they can find their
dependencies.
'';
};
}

View File

@ -0,0 +1,82 @@
def __boot():
import sys, imp, os, os.path
PYTHONPATH = os.environ.get('PYTHONPATH')
if PYTHONPATH is None or (sys.platform=='win32' and not PYTHONPATH):
PYTHONPATH = []
else:
PYTHONPATH = PYTHONPATH.split(os.pathsep)
pic = getattr(sys,'path_importer_cache',{})
stdpath = sys.path[len(PYTHONPATH):]
mydir = os.path.dirname(__file__)
#print "searching",stdpath,sys.path
for item in stdpath:
if item==mydir or not item:
continue # skip if current dir. on Windows, or my own directory
importer = pic.get(item)
if importer is not None:
loader = importer.find_module('site')
if loader is not None:
# This should actually reload the current module
loader.load_module('site')
break
else:
try:
stream, path, descr = imp.find_module('site',[item])
except ImportError:
continue
if stream is None:
continue
try:
# This should actually reload the current module
imp.load_module('site',stream,path,descr)
finally:
stream.close()
break
else:
raise ImportError("Couldn't find the real 'site' module")
#print "loaded", __file__
known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
oldpos = getattr(sys,'__egginsert',0) # save old insertion position
sys.__egginsert = 0 # and reset the current one
for item in PYTHONPATH:
addsitedir(item)
sys.__egginsert += oldpos # restore effective old position
d,nd = makepath(stdpath[0])
insert_at = None
new_path = []
for item in sys.path:
p,np = makepath(item)
if np==nd and insert_at is None:
# We've hit the first 'system' path entry, so added entries go here
insert_at = len(new_path)
if np in known_paths or insert_at is None:
new_path.append(item)
else:
# new path after the insert point, back-insert it
new_path.insert(insert_at, item)
insert_at += 1
sys.path[:] = new_path
if __name__=='site':
__boot()
del __boot

View File

@ -19,6 +19,12 @@ let pythonPackages = python.modules // rec {
};
site = import ../development/python-modules/site {
inherit (pkgs) stdenv;
inherit python;
};
ipython = import ../shells/ipython {
inherit (pkgs) stdenv fetchurl;
inherit buildPythonPackage pythonPackages;