Without this patch `virtualenv --python=python2.7 .` fails with an error because it notices that the python readline.so is not in the same path as python2.7. I assume this is to avoid copying the wrong file on systems where it is possible to find incompatible libraries by accident. Adding "/nix/store" to the prefix fixes this problem. A sitecustomize.py is created in the virtualenv which makes libraries from the python specified by the --python argument available to the virtualenv. For example, this makes readline and sqlite3 available when a wrapped python is specified. If no --python argument is passed, it will only add the path to the python used when building `virtualenv`, which is the unwrapped python, so sqlite3 won't be available. diff --git a/src/virtualenv.py b/src/virtualenv.py index 4b57cde..afda73f 100755 --- a/src/virtualenv.py +++ b/src/virtualenv.py @@ -1071,20 +1071,7 @@ def path_locations(home_dir, dry_run=False): def change_prefix(filename, dst_prefix): - prefixes = [sys.prefix] - - if is_darwin: - prefixes.extend( - ( - os.path.join("/Library/Python", sys.version[:3], "site-packages"), - os.path.join(sys.prefix, "Extras", "lib", "python"), - os.path.join("~", "Library", "Python", sys.version[:3], "site-packages"), - # Python 2.6 no-frameworks - os.path.join("~", ".local", "lib", "python", sys.version[:3], "site-packages"), - # System Python 2.7 on OSX Mountain Lion - os.path.join("~", "Library", "Python", sys.version[:3], "lib", "python", "site-packages"), - ) - ) + prefixes = ["/nix/store", sys.prefix] if hasattr(sys, "real_prefix"): prefixes.append(sys.real_prefix) @@ -1107,6 +1094,8 @@ def change_prefix(filename, dst_prefix): if src_prefix != os.sep: # sys.prefix == "/" assert relpath[0] == os.sep relpath = relpath[1:] + if src_prefix == "/nix/store": + relpath = "/".join(relpath.split("/")[1:]) return join(dst_prefix, relpath) assert False, "Filename {} does not start with any of these prefixes: {}".format(filename, prefixes) @@ -1233,6 +1222,11 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy site_filename_dst = change_prefix(site_filename, home_dir) site_dir = os.path.dirname(site_filename_dst) writefile(site_filename_dst, SITE_PY) + wrapper_path = join(prefix, "lib", py_version, "site-packages") + writefile( + join(site_dir, 'sitecustomize.py',), + "import sys; sys.path.append('%s')" % wrapper_path + ) writefile(join(site_dir, "orig-prefix.txt"), prefix) site_packages_filename = join(site_dir, "no-global-site-packages.txt") if not site_packages: