summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2015-02-06 11:23:58 -0500
committerBarry Warsaw <barry@python.org>2015-02-06 11:23:58 -0500
commit6c96833c77638224430f6d02bd5a7be1da7d0449 (patch)
tree6ba660375de96d99d188afea79463f840b46ec30
parenta5b2141ece7c608016dfa49f7a67e4a1b43aeea8 (diff)
downloadcpython-6c96833c77638224430f6d02bd5a7be1da7d0449.tar.gz
Issue #23399: pyvenv creates relative symlinks where possible.
-rw-r--r--Lib/venv/__init__.py14
-rw-r--r--Misc/NEWS2
2 files changed, 10 insertions, 6 deletions
diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
index 3a7e8e257a..3d606ef89c 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 1fedcf5c2b..c13372ac83 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.