Source code for shiv.pip

import contextlib
import os
import subprocess
import sys

from typing import Generator, List

from .constants import PIP_REQUIRE_VIRTUALENV, PIP_INSTALL_ERROR


[docs]@contextlib.contextmanager def clean_pip_env() -> Generator[None, None, None]: """A context manager for temporarily removing 'PIP_REQUIRE_VIRTUALENV' from the environment. Since shiv installs via `--target`, we need to ignore venv requirements if they exist. """ require_venv = os.environ.pop(PIP_REQUIRE_VIRTUALENV, None) try: yield finally: if require_venv is not None: os.environ[PIP_REQUIRE_VIRTUALENV] = require_venv
[docs]def install(interpreter_path: str, args: List[str]) -> None: """`pip install` as a function. Accepts a list of pip arguments. .. code-block:: py >>> install('/usr/local/bin/python3', ['numpy', '--target', 'site-packages']) Collecting numpy Downloading numpy-1.13.3-cp35-cp35m-manylinux1_x86_64.whl (16.9MB) 100% || 16.9MB 53kB/s Installing collected packages: numpy Successfully installed numpy-1.13.3 """ with clean_pip_env(): process = subprocess.Popen( [interpreter_path, "-m", "pip", "install"] + args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) for output in process.stdout: if output: print(output.decode().rstrip()) if process.wait() > 0: sys.exit(PIP_INSTALL_ERROR)