diff --git a/setup.py b/setup.py index 9b7fdeb1134..2179d34d2bf 100644 --- a/setup.py +++ b/setup.py @@ -81,5 +81,7 @@ def get_version(rel_path: str) -> str: ], }, zip_safe=False, + # NOTE: python_requires is duplicated in __pip-runner__.py. + # When changing this value, please change the other copy as well. python_requires=">=3.7", ) diff --git a/src/pip/__pip-runner__.py b/src/pip/__pip-runner__.py index 14026c0d131..49a148a097e 100644 --- a/src/pip/__pip-runner__.py +++ b/src/pip/__pip-runner__.py @@ -4,24 +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 + +# Copied from setup.py +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