mirror of https://github.com/python/cpython
95 lines
2.2 KiB
Python
95 lines
2.2 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
|
|
if ns.include_pip_user:
|
|
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
|