From 581c29f8fe20a6d95f036a3499b55cc2c587b25f Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 6 Feb 2015 11:23:58 -0500 Subject: [PATCH] Issue #23399: pyvenv creates relative symlinks where possible. --- Lib/venv/__init__.py | 14 ++++++++------ Misc/NEWS | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 3a7e8e257a8..3d606ef89c3 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -141,10 +141,9 @@ class EnvBuilder: # Issue 21197: create lib64 as a symlink to lib on 64-bit non-OS X POSIX if ((sys.maxsize > 2**32) and (os.name == 'posix') and (sys.platform != 'darwin')): - p = os.path.join(env_dir, 'lib') link_path = os.path.join(env_dir, 'lib64') if not os.path.exists(link_path): # Issue #21643 - os.symlink(p, link_path) + os.symlink('lib', link_path) context.bin_path = binpath = os.path.join(env_dir, binname) context.bin_name = binname context.env_exe = os.path.join(binpath, exename) @@ -178,7 +177,7 @@ class EnvBuilder: result = f.startswith('python') and f.endswith('.exe') return result - def symlink_or_copy(self, src, dst): + def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): """ Try symlinking a file, and if that fails, fall back to copying. """ @@ -186,7 +185,11 @@ class EnvBuilder: if not force_copy: try: if not os.path.islink(dst): # can't link to itself! - os.symlink(src, dst) + if relative_symlinks_ok: + assert os.path.dirname(src) == os.path.dirname(dst) + os.symlink(os.path.basename(src), dst) + else: + os.symlink(src, dst) except Exception: # may need to use a more specific exception logger.warning('Unable to symlink %r to %r', src, dst) force_copy = True @@ -201,7 +204,6 @@ class EnvBuilder: being processed. """ binpath = context.bin_path - exename = context.python_exe path = context.env_exe copier = self.symlink_or_copy copier(context.executable, path) @@ -214,7 +216,7 @@ class EnvBuilder: if not os.path.exists(path): # Issue 18807: make copies if # symlinks are not wanted - copier(context.env_exe, path) + copier(context.env_exe, path, relative_symlinks_ok=True) if not os.path.islink(path): os.chmod(path, 0o755) else: diff --git a/Misc/NEWS b/Misc/NEWS index 1fedcf5c2b4..c13372ac832 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -59,6 +59,8 @@ Core and Builtins Library ------- +- Issue #23399: pyvenv creates relative symlinks where possible. + - Issue #23099: Closing io.BytesIO with exported buffer is rejected now to prevent corrupting exported buffer.