diff --git a/src/pip/__pip-runner__.py b/src/pip/__pip-runner__.py index 28e4399b054..c582bebd737 100644 --- a/src/pip/__pip-runner__.py +++ b/src/pip/__pip-runner__.py @@ -4,26 +4,38 @@ an import statement. """ -import runpy +# /!\ This version compatibility check section must be Python 2 compatible. /!\ + import sys -import types -from importlib.machinery import ModuleSpec, PathFinder -from os.path import dirname -from typing import Optional, Sequence, Union -PIP_SOURCES_ROOT = dirname(dirname(__file__)) # Copied from setup.py -PYTHON_REQUIRES = ">=3.7" +PYTHON_REQUIRES = (3, 7) + + +def version_str(version): # type: ignore + return ".".join(str(v) for v in version) + + +if sys.version_info[:2] < PYTHON_REQUIRES: + raise SystemExit( + "This version of pip does not support python {} (requires >={}).".format( + version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) + ) + ) + +# From here on, we can use Python 3 features, but the syntax must remain +# Python 2 compatible. + +import runpy # noqa: E402 +from importlib.machinery import PathFinder # noqa: E402 +from os.path import dirname # noqa: E402 + +PIP_SOURCES_ROOT = dirname(dirname(__file__)) class PipImportRedirectingFinder: @classmethod - def find_spec( - self, - fullname: str, - path: Optional[Sequence[Union[bytes, str]]] = None, - target: Optional[types.ModuleType] = None, - ) -> Optional[ModuleSpec]: + def find_spec(self, fullname, path=None, target=None): # type: ignore if fullname != "pip": return None @@ -32,22 +44,8 @@ def find_spec( return spec -def check_python_version() -> None: - # Import here to ensure the imports happen after the sys.meta_path change. - from pip._vendor.packaging.specifiers import SpecifierSet - from pip._vendor.packaging.version import Version - - py_ver = Version("{0.major}.{0.minor}.{0.micro}".format(sys.version_info)) - if py_ver not in SpecifierSet(PYTHON_REQUIRES): - raise SystemExit( - f"This version of pip does not support python {py_ver} " - f"(requires {PYTHON_REQUIRES})" - ) - - # TODO https://github.com/pypa/pip/issues/11294 sys.meta_path.insert(0, PipImportRedirectingFinder()) assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" -check_python_version() runpy.run_module("pip", run_name="__main__", alter_sys=True)