diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index e13cd8cf989..8dfff519aa5 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -203,17 +203,22 @@ class BasicTest(BaseTest): """ Test upgrading an existing environment directory. """ - builder = venv.EnvBuilder(upgrade=True) - self.run_with_capture(builder.create, self.env_dir) - self.isdir(self.bindir) - self.isdir(self.include) - self.isdir(*self.lib) - fn = self.get_env_file(self.bindir, self.exe) - if not os.path.exists(fn): # diagnostics for Windows buildbot failures - bd = self.get_env_file(self.bindir) - print('Contents of %r:' % bd) - print(' %r' % os.listdir(bd)) - self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn) + # See Issue #21643: the loop needs to run twice to ensure + # that everything works on the upgrade (the first run just creates + # the venv). + for upgrade in (False, True): + builder = venv.EnvBuilder(upgrade=upgrade) + self.run_with_capture(builder.create, self.env_dir) + self.isdir(self.bindir) + self.isdir(self.include) + self.isdir(*self.lib) + fn = self.get_env_file(self.bindir, self.exe) + if not os.path.exists(fn): + # diagnostics for Windows buildbot failures + bd = self.get_env_file(self.bindir) + print('Contents of %r:' % bd) + print(' %r' % os.listdir(bd)) + self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn) def test_isolation(self): """ diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 252bffbd7be..c258b1c05a4 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -30,7 +30,6 @@ optional arguments: import logging import os import shutil -import struct import subprocess import sys import types @@ -140,11 +139,12 @@ class EnvBuilder: create_if_needed(path) create_if_needed(libpath) # Issue 21197: create lib64 as a symlink to lib on 64-bit non-OS X POSIX - if ((struct.calcsize('P') == 8) and (os.name == 'posix') and + 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') - os.symlink(p, link_path) + if not os.path.exists(link_path): # Issue #21643 + os.symlink(p, link_path) context.bin_path = binpath = os.path.join(env_dir, binname) context.bin_name = binname context.env_exe = os.path.join(binpath, exename)