-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Virtualenv currently doesn't work with a python installation configured with different --prefix and --exec-prefix, due to the way it handles lib-dynload. Currently, it first copies over a couple files in lib-dynload ( zlib.so and readline.so ) and creates the lib-dynload directory in the process. It then tries to fixup exec-prefix installtions by copying over the lib-dynload from sys.exec_prefix, but failes with "File already exists". This results in many key modules becoming unavailable, such as _hashlib.so (dependency of setuptools) and _time.so (dependency of distribute).
My fix was to add recursion in the copyfile() function which copying a directory which already exists in the destination. This necessitates skipping site-packages during the exec-prefix setup.
Patch: ( Sorry for the format. I don't see an "attach file" option. )
--- virtualenv.orig 2011-04-26 20:27:02.557885000 -0700
+++ virtualenv.py 2011-04-26 21:49:58.111075000 -0700
@@ -394,6 +394,14 @@
# Some bad symlink in the src
logger.warn('Cannot find file %s (bad symlink)', src)
return
+ if os.path.isdir(dest):
+ logger.debug('Directory %s already exists', dest)
+ logger.indent += 2
+ try:
+ for fn in os.listdir(src):
+ copyfile(join(src, fn), join(dest, fn), symlink)
+ finally:
+ logger.indent -= 2
if os.path.exists(dest):
logger.debug('File %s already exists', dest)
return
@@ -884,7 +892,7 @@
def change_prefix(filename, dst_prefix):
- prefixes = [sys.prefix]
+ prefixes = [sys.prefix, sys.exec_prefix]
if sys.platform == "darwin":
prefixes.extend((
@@ -1004,8 +1012,14 @@
exec_dir = join(sys.exec_prefix, 'Lib')
else:
exec_dir = join(sys.exec_prefix, 'lib', py_version)
- for fn in os.listdir(exec_dir):
- copyfile(join(exec_dir, fn), join(lib_dir, fn))
+ logger.debug('Exec dir %s', exec_dir)
+ logger.indent += 2
+ try:
+ for fn in os.listdir(exec_dir):
+ if fn != 'site-packages':
+ copyfile(join(exec_dir, fn), join(lib_dir, fn))
+ finally:
+ logger.indent -= 2
if is_jython:
# Jython has either jython-dev.jar and javalib/ dir, or just