The logic in add2virtualenv of adding paths to the front of sys.path breaks installing packages in the virtualenv that use a PEP517 build. In preparing the build environment pip tries to determine the necessary sys.path using a "sitecustomize.py" written in pip's _internal/build_env.py, which gets confused with paths not being added to the end of sys.path. The result is that the lib-dynload path of the Python environment gets removed from sys.path and pip install fails with a traceback like this
# pip install .Processing/Devel/fooInstallingbuilddependencies ... doneGettingrequirementstobuildwheel ... doneERROR: Exception:
Traceback (mostrecentcalllast):
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/cli/base_command.py", line180, inexc_logging_wrapperstatus=run_func(*args)
^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/cli/req_command.py", line245, inwrapperreturnfunc(self, options, args)
^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/commands/install.py", line377, inrunrequirement_set=resolver.resolve(
^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line76, inresolvecollected=self.factory.collect_root_requirements(root_reqs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py", line534, incollect_root_requirementsreqs=list(
^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py", line490, in_make_requirements_from_install_reqcand=self._make_base_candidate_from_link(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py", line228, in_make_base_candidate_from_linkself._link_candidate_cache[link] =LinkCandidate(
^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line290, in__init__super().__init__(
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line156, in__init__self.dist=self._prepare()
^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line222, in_preparedist=self._prepare_distribution()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line301, in_prepare_distributionreturnpreparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line525, inprepare_linked_requirementreturnself._prepare_linked_requirement(req, parallel_builds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line640, in_prepare_linked_requirementdist=_get_prepared_distribution(
^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line71, in_get_prepared_distributionabstract_dist.prepare_distribution_metadata(
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py", line54, inprepare_distribution_metadataself._install_build_reqs(finder)
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py", line124, in_install_build_reqsbuild_reqs=self._get_build_requires_wheel()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py", line101, in_get_build_requires_wheelreturnbackend.get_requires_for_build_wheel()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_internal/utils/misc.py", line745, inget_requires_for_build_wheelreturnsuper().get_requires_for_build_wheel(config_settings=cs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py", line166, inget_requires_for_build_wheelreturnself._call_hook('get_requires_for_build_wheel', {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py", line321, in_call_hookraiseBackendUnavailable(data.get('traceback', ''))
pip._vendor.pyproject_hooks._impl.BackendUnavailable: Traceback (mostrecentcalllast):
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line77, in_build_backendobj=import_module(mod_path)
^^^^^^^^^^^^^^^^^^^^^^^File"/usr/lib64/python3.11/importlib/__init__.py", line126, inimport_modulereturn_bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"<frozen importlib._bootstrap>", line1204, in_gcd_importFile"<frozen importlib._bootstrap>", line1176, in_find_and_loadFile"<frozen importlib._bootstrap>", line1126, in_find_and_load_unlockedFile"<frozen importlib._bootstrap>", line241, in_call_with_frames_removedFile"<frozen importlib._bootstrap>", line1204, in_gcd_importFile"<frozen importlib._bootstrap>", line1176, in_find_and_loadFile"<frozen importlib._bootstrap>", line1147, in_find_and_load_unlockedFile"<frozen importlib._bootstrap>", line690, in_load_unlockedFile"<frozen importlib._bootstrap_external>", line940, inexec_moduleFile"<frozen importlib._bootstrap>", line241, in_call_with_frames_removedFile"/tmp/pip-build-env-pitma8s7/overlay/lib/python3.11/site-packages/setuptools/__init__.py", line8, in<module>import_distutils_hack.override# noqa: F401^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/_distutils_hack/override.py", line1, in<module>__import__('_distutils_hack').do_override()
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/_distutils_hack/__init__.py", line70, indo_overrideensure_local_distutils()
File"/root/.virtualenvs/foo/lib/python3.11/site-packages/_distutils_hack/__init__.py", line53, inensure_local_distutilsimportlib.import_module('distutils')
File"/usr/lib64/python3.11/importlib/__init__.py", line126, inimport_modulereturn_bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/_distutils_hack/__init__.py", line90, infind_specreturnmethod()
^^^^^^^^File"/root/.virtualenvs/foo/lib/python3.11/site-packages/_distutils_hack/__init__.py", line97, inspec_for_distutilsimportimportlib.abcFile"/usr/lib64/python3.11/importlib/abc.py", line19, in<module>from .resources.abcimportResourceReader, Traversable, TraversableResourcesFile"/usr/lib64/python3.11/importlib/resources/__init__.py", line3, in<module>from ._commonimport (
File"/usr/lib64/python3.11/importlib/resources/_common.py", line3, in<module>importtempfileFile"/usr/lib64/python3.11/tempfile.py", line45, in<module>fromrandomimportRandomas_RandomFile"/usr/lib64/python3.11/random.py", line49, in<module>frommathimportlogas_log, expas_exp, pias_pi, eas_e, ceilas_ceilModuleNotFoundError: Nomodulenamed'math'This can be reproduced with a fresh virtualenv that contains a couple - in this setup it was three, but in other environments two were enough - paths added via add2virtualenv
The logic in add2virtualenv of adding paths to the front of sys.path breaks installing packages in the virtualenv that use a PEP517 build. In preparing the build environment pip tries to determine the necessary sys.path using a "sitecustomize.py" written in pip's
_internal/build_env.py, which gets confused with paths not being added to the end of sys.path. The result is that the lib-dynload path of the Python environment gets removed from sys.path and pip install fails with a traceback like thisThis can be reproduced with a fresh virtualenv that contains a couple - in this setup it was three, but in other environments two were enough - paths added via add2virtualenv
and then installing a basically empty package with a minimal pyproject.toml