You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.4 KiB
50 lines
1.4 KiB
"""Execute exactly this copy of pip, within a different environment. |
|
|
|
This file is named as it is, to ensure that this module can't be imported via |
|
an import statement. |
|
""" |
|
|
|
# /!\ This version compatibility check section must be Python 2 compatible. /!\ |
|
|
|
import sys |
|
|
|
# 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, path=None, target=None): # type: ignore |
|
if fullname != "pip": |
|
return None |
|
|
|
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__", alter_sys=True)
|
|
|