(root)/
Python-3.12.0/
PC/
layout/
support/
pip.py
       1  """
       2  Extraction and file list generation for pip.
       3  """
       4  
       5  __author__ = "Steve Dower <steve.dower@python.org>"
       6  __version__ = "3.8"
       7  
       8  
       9  import os
      10  import shutil
      11  import subprocess
      12  import sys
      13  
      14  from .filesets import *
      15  
      16  __all__ = ["extract_pip_files", "get_pip_layout"]
      17  
      18  
      19  def get_pip_dir(ns):
      20      if ns.copy:
      21          if ns.zip_lib:
      22              return ns.copy / "packages"
      23          return ns.copy / "Lib" / "site-packages"
      24      else:
      25          return ns.temp / "packages"
      26  
      27  
      28  def get_pip_layout(ns):
      29      pip_dir = get_pip_dir(ns)
      30      if not pip_dir.is_dir():
      31          log_warning("Failed to find {} - pip will not be included", pip_dir)
      32      else:
      33          pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}"
      34          for dest, src in rglob(pip_dir, "**/*"):
      35              yield pkg_root.format(dest), src
      36          if ns.include_pip_user:
      37              content = "\n".join(
      38                  "[{}]\nuser=yes".format(n)
      39                  for n in ["install", "uninstall", "freeze", "list"]
      40              )
      41              yield "pip.ini", ("pip.ini", content.encode())
      42  
      43  
      44  def extract_pip_files(ns):
      45      dest = get_pip_dir(ns)
      46      try:
      47          dest.mkdir(parents=True, exist_ok=False)
      48      except IOError:
      49          return
      50  
      51      src = ns.source / "Lib" / "ensurepip" / "_bundled"
      52  
      53      ns.temp.mkdir(parents=True, exist_ok=True)
      54      wheels = [shutil.copy(whl, ns.temp) for whl in src.glob("*.whl")]
      55      search_path = os.pathsep.join(wheels)
      56      if os.environ.get("PYTHONPATH"):
      57          search_path += ";" + os.environ["PYTHONPATH"]
      58  
      59      env = os.environ.copy()
      60      env["PYTHONPATH"] = search_path
      61  
      62      output = subprocess.check_output(
      63          [
      64              sys.executable,
      65              "-m",
      66              "pip",
      67              "--no-color",
      68              "install",
      69              "pip",
      70              "--upgrade",
      71              "--target",
      72              str(dest),
      73              "--no-index",
      74              "--no-compile",
      75              "--no-cache-dir",
      76              "-f",
      77              str(src),
      78              "--only-binary",
      79              ":all:",
      80          ],
      81          env=env,
      82      )
      83  
      84      try:
      85          shutil.rmtree(dest / "bin")
      86      except OSError:
      87          pass
      88  
      89      for file in wheels:
      90          try:
      91              os.remove(file)
      92          except OSError:
      93              pass