From 10384837a516836411875272b2facf01dd9802b9 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 6 Jun 2025 14:56:41 -0600 Subject: [PATCH 1/2] Fix production use of commonpath. This should get more Windows tests /use cases passing. --- pex/venv/virtualenv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pex/venv/virtualenv.py b/pex/venv/virtualenv.py index 22711b156..38f4d3bb3 100644 --- a/pex/venv/virtualenv.py +++ b/pex/venv/virtualenv.py @@ -16,7 +16,7 @@ from pex.atomic_directory import AtomicDirectory, atomic_directory from pex.common import safe_mkdir, safe_open -from pex.compatibility import commonpath, get_stdout_bytes_buffer, safe_commonpath +from pex.compatibility import get_stdout_bytes_buffer, safe_commonpath from pex.dist_metadata import Distribution, find_distributions from pex.enum import Enum from pex.executor import Executor @@ -106,7 +106,7 @@ def _find_preferred_site_packages_dir( interpreter = interpreter or PythonInterpreter.get() for entry in interpreter.site_packages: - if commonpath((real_venv_dir, entry.path)) != real_venv_dir: + if safe_commonpath((real_venv_dir, entry.path)) != real_venv_dir: # This ignores system site packages when the venv is built with --system-site-packages. continue if os.path.isdir(entry.path): From 14b4d5ca52dca87f1fba1f3093b0cb6229cb3e0e Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 6 Jun 2025 15:19:37 -0600 Subject: [PATCH 2/2] Also avoid symlinks on Windows. --- pex/pex_bootstrapper.py | 5 +++-- pex/pex_builder.py | 5 ++++- pex/pip/installation.py | 5 ++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pex/pex_bootstrapper.py b/pex/pex_bootstrapper.py index b36d6ea7b..8b92ae3ae 100644 --- a/pex/pex_bootstrapper.py +++ b/pex/pex_bootstrapper.py @@ -22,7 +22,7 @@ ) from pex.layout import Layout from pex.orderedset import OrderedSet -from pex.os import safe_execv +from pex.os import WINDOWS, safe_execv from pex.pex_info import PexInfo from pex.sysconfig import SCRIPT_DIR, script_name from pex.targets import LocalInterpreter @@ -585,7 +585,8 @@ def ensure_venv( copy_mode = copy_mode or ( CopyMode.SYMLINK if ( - pex.layout != Layout.LOOSE + not WINDOWS + and pex.layout != Layout.LOOSE and not pex_info.venv_site_packages_copies ) else CopyMode.LINK diff --git a/pex/pex_builder.py b/pex/pex_builder.py index 50deb150d..316116cc4 100644 --- a/pex/pex_builder.py +++ b/pex/pex_builder.py @@ -36,6 +36,7 @@ from pex.interpreter import PythonInterpreter from pex.layout import Layout from pex.orderedset import OrderedSet +from pex.os import WINDOWS from pex.pep_376 import InstalledWheel from pex.pex import PEX from pex.pex_info import PexInfo @@ -164,7 +165,9 @@ def __init__( self._chroot = chroot or Chroot(path or safe_mkdtemp()) self._pex_info = pex_info or PexInfo.default() self._preamble = preamble or "" - self._copy_mode = copy_mode + self._copy_mode = ( + CopyMode.LINK if ((copy_mode is CopyMode.SYMLINK) and WINDOWS) else copy_mode + ) self._shebang = self._interpreter.identity.hashbang() self._header = None # type: Optional[str] diff --git a/pex/pip/installation.py b/pex/pip/installation.py index 5a8868366..93a6f712a 100644 --- a/pex/pip/installation.py +++ b/pex/pip/installation.py @@ -20,6 +20,7 @@ from pex.interpreter import PythonInterpreter from pex.jobs import iter_map_parallel from pex.orderedset import OrderedSet +from pex.os import WINDOWS from pex.pep_503 import ProjectName from pex.pex import PEX from pex.pex_bootstrapper import ensure_venv @@ -54,7 +55,9 @@ def _create_pip( pip_interpreter = interpreter or PythonInterpreter.get() pex = PEX(pip_pex.path, interpreter=pip_interpreter) - venv_pex = ensure_venv(pex, copy_mode=CopyMode.SYMLINK, record_access=record_access) + venv_pex = ensure_venv( + pex, copy_mode=CopyMode.LINK if WINDOWS else CopyMode.SYMLINK, record_access=record_access + ) pex_hash = pex.pex_info().pex_hash production_assert(pex_hash is not None) pip_venv = PipVenv(