diff --git a/news/11704.bugfix.rst b/news/11704.bugfix.rst new file mode 100644 index 00000000000..0e7902a2590 --- /dev/null +++ b/news/11704.bugfix.rst @@ -0,0 +1,2 @@ +Fix an issue when an already existing in-memory distribution would cause +exceptions in ``pip install`` diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 4543be34c20..bb38ec09da4 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -195,7 +195,11 @@ def __str__(self) -> str: else: s = "" if self.satisfied_by is not None: - s += " in {}".format(display_path(self.satisfied_by.location)) + if self.satisfied_by.location is not None: + location = display_path(self.satisfied_by.location) + else: + location = "" + s += f" in {location}" if self.comes_from: if isinstance(self.comes_from, str): comes_from: Optional[str] = self.comes_from diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py index 7b07226c90e..3fd9329bc6e 100644 --- a/tests/functional/test_install.py +++ b/tests/functional/test_install.py @@ -2351,3 +2351,45 @@ def test_install_8559_wheel_package_present( allow_stderr_warning=False, ) assert DEPRECATION_MSG_PREFIX not in result.stderr + + +@pytest.mark.skipif( + sys.version_info < (3, 11), + reason="3.11 required to find distributions via importlib metadata", +) +def test_install_existing_memory_distribution(script: PipTestEnvironment) -> None: + sitecustomize_text = textwrap.dedent( + """ + import sys + from importlib.metadata import Distribution, DistributionFinder + + + EXAMPLE_METADATA = '''Metadata-Version: 2.1 + Name: example + Version: 1.0.0 + + ''' + + class ExampleDistribution(Distribution): + def locate_file(self, path): + return path + + def read_text(self, filename): + if filename == 'METADATA': + return EXAMPLE_METADATA + + + class CustomFinder(DistributionFinder): + def find_distributions(self, context=None): + return [ExampleDistribution()] + + + sys.meta_path.append(CustomFinder()) + """ + ) + with open(script.site_packages_path / "sitecustomize.py", "w") as sitecustomize: + sitecustomize.write(sitecustomize_text) + + result = script.pip("install", "example") + + assert "Requirement already satisfied: example in " in result.stdout