cpython/PC/layout/support/pip.py

94 lines
2.1 KiB
Python

"""
Extraction and file list generation for pip.
"""
__author__ = "Steve Dower <steve.dower@python.org>"
__version__ = "3.8"
import os
import shutil
import subprocess
import sys
from .filesets import *
__all__ = ["extract_pip_files", "get_pip_layout"]
def get_pip_dir(ns):
if ns.copy:
if ns.zip_lib:
return ns.copy / "packages"
return ns.copy / "Lib" / "site-packages"
else:
return ns.temp / "packages"
def get_pip_layout(ns):
pip_dir = get_pip_dir(ns)
if not pip_dir.is_dir():
log_warning("Failed to find {} - pip will not be included", pip_dir)
else:
pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}"
for dest, src in rglob(pip_dir, "**/*"):
yield pkg_root.format(dest), src
content = "\n".join(
"[{}]\nuser=yes".format(n)
for n in ["install", "uninstall", "freeze", "list"]
)
yield "pip.ini", ("pip.ini", content.encode())
def extract_pip_files(ns):
dest = get_pip_dir(ns)
try:
dest.mkdir(parents=True, exist_ok=False)
except IOError:
return
src = ns.source / "Lib" / "ensurepip" / "_bundled"
ns.temp.mkdir(parents=True, exist_ok=True)
wheels = [shutil.copy(whl, ns.temp) for whl in src.glob("*.whl")]
search_path = os.pathsep.join(wheels)
if os.environ.get("PYTHONPATH"):
search_path += ";" + os.environ["PYTHONPATH"]
env = os.environ.copy()
env["PYTHONPATH"] = search_path
output = subprocess.check_output(
[
sys.executable,
"-m",
"pip",
"--no-color",
"install",
"pip",
"setuptools",
"--upgrade",
"--target",
str(dest),
"--no-index",
"--no-compile",
"--no-cache-dir",
"-f",
str(src),
"--only-binary",
":all:",
],
env=env,
)
try:
shutil.rmtree(dest / "bin")
except OSError:
pass
for file in wheels:
try:
os.remove(file)
except OSError:
pass