mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			93 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",
 | 
						|
            "--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
 |