Rework the pip runner to use `PathFinder`
This makes it possible to only "replace" `pip` and have the submodules
get correctly located by the regular importlib machinery. This also
asserts that it was able to locate the module, ensuring that failure to
locate the module results in an exception.
@@ -4,15 +4,14 @@ This file is named as it is, to ensure that this module can't be imported via
an import statement.
"""
-import importlib.util
import runpy
import sys
import types
-from importlib.machinery import ModuleSpec
-from os.path import dirname, join
+from importlib.machinery import ModuleSpec, PathFinder
+from os.path import dirname
from typing import Optional, Sequence, Union
-PIP_SOURCES_ROOT = dirname(dirname(dirname(__file__)))
+PIP_SOURCES_ROOT = dirname(dirname(__file__))
class PipImportRedirectingFinder:
@@ -23,15 +22,15 @@ class PipImportRedirectingFinder:
path: Optional[Sequence[Union[bytes, str]]] = None,
target: Optional[types.ModuleType] = None,
) -> Optional[ModuleSpec]:
- if not fullname.startswith("pip."):
+ if fullname != "pip":
return None
- # Import pip from the source directory of this file
- location = join(PIP_SOURCES_ROOT, *fullname.split("."))
- return importlib.util.spec_from_file_location(fullname, location)
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
+ assert spec, (PIP_SOURCES_ROOT, fullname)
+ return spec
sys.meta_path.insert(0, PipImportRedirectingFinder())
assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
-runpy.run_module("pip", run_name="__main__")
+runpy.run_module("pip", run_name="__main__", alter_sys=True)
