def _spawn_pip_isolated(self, args, cache=None, interpreter=None): pip_args = [ '--disable-pip-version-check', '--isolated', '--exists-action', 'i' ] # The max pip verbosity is -vvv and for pex it's -vvvvvvvvv; so we scale down by a factor of 3. pex_verbosity = ENV.PEX_VERBOSE pip_verbosity = pex_verbosity // 3 if pip_verbosity > 0: pip_args.append('-{}'.format('v' * pip_verbosity)) else: pip_args.append('-q') if cache: pip_args.extend(['--cache-dir', cache]) else: pip_args.append('--no-cache-dir') command = pip_args + args with ENV.strip().patch(PEX_ROOT=ENV.PEX_ROOT, PEX_VERBOSE=str(pex_verbosity)) as env: from pex.pex import PEX pip = PEX(pex=self._pip_pex_path, interpreter=interpreter) return Job(command=pip.cmdline(command), process=pip.run(args=command, env=env, blocking=False))
def _spawn_pip_isolated(self, args, cache=None, interpreter=None): pip_args = [ # We vendor the version of pip we want so pip should never check for updates. "--disable-pip-version-check", # Don't read pip configuration files like `~/.config/pip/pip.conf`. "--isolated", # If we want to warn about a version of python we support, we should do it, not pip. "--no-python-version-warning", # If pip encounters a duplicate file path during its operations we don't want it to prompt # and we'd also like to know about this since it should never occur. We leverage the pip # global option: # --exists-action <action> # Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort. "--exists-action", "a", ] # The max pip verbosity is -vvv and for pex it's -vvvvvvvvv; so we scale down by a factor of 3. pex_verbosity = ENV.PEX_VERBOSE pip_verbosity = pex_verbosity // 3 if pip_verbosity > 0: pip_args.append("-{}".format("v" * pip_verbosity)) else: pip_args.append("-q") if cache: pip_args.extend(["--cache-dir", cache]) else: pip_args.append("--no-cache-dir") command = pip_args + args with ENV.strip().patch(PEX_ROOT=cache or ENV.PEX_ROOT, PEX_VERBOSE=str(pex_verbosity)) as env: # Guard against API calls from environment with ambient PYTHONPATH preventing pip PEX # bootstrapping. See: https://github.com/pantsbuild/pex/issues/892 pythonpath = env.pop("PYTHONPATH", None) if pythonpath: TRACER.log( "Scrubbed PYTHONPATH={} from the pip PEX environment.". format(pythonpath), V=3) from pex.pex import PEX pip = PEX(pex=self._pip_pex_path, interpreter=interpreter) return Job(command=pip.cmdline(command), process=pip.run(args=command, env=env, blocking=False))
def _spawn_pip_isolated(self, args, cache=None, interpreter=None): pip_args = [ # We vendor the version of pip we want so pip should never check for updates. '--disable-pip-version-check', # Don't read pip configuration files like `~/.config/pip/pip.conf`. '--isolated', # If we want to warn about a version of python we support, we should do it, not pip. '--no-python-version-warning' ] # The max pip verbosity is -vvv and for pex it's -vvvvvvvvv; so we scale down by a factor of 3. pex_verbosity = ENV.PEX_VERBOSE pip_verbosity = pex_verbosity // 3 if pip_verbosity > 0: pip_args.append('-{}'.format('v' * pip_verbosity)) else: pip_args.append('-q') if cache: pip_args.extend(['--cache-dir', cache]) else: pip_args.append('--no-cache-dir') command = pip_args + args with ENV.strip().patch(PEX_ROOT=ENV.PEX_ROOT, PEX_VERBOSE=str(pex_verbosity)) as env: # Guard against API calls from environment with ambient PYTHONPATH preventing pip PEX # bootstrapping. See: https://github.com/pantsbuild/pex/issues/892 pythonpath = env.pop('PYTHONPATH', None) if pythonpath: TRACER.log('Scrubbed PYTHONPATH={} from the pip PEX environment.'.format(pythonpath), V=3) from pex.pex import PEX pip = PEX(pex=self._pip_pex_path, interpreter=interpreter) return Job( command=pip.cmdline(command), process=pip.run( args=command, env=env, blocking=False ) )
def _spawn_pip_isolated( self, args, # type: Iterable[str] package_index_configuration=None, # type: Optional[PackageIndexConfiguration] cache=None, # type: Optional[str] interpreter=None, # type: Optional[PythonInterpreter] ): # type: (...) -> Job pip_args = [ # We vendor the version of pip we want so pip should never check for updates. "--disable-pip-version-check", # If we want to warn about a version of python we support, we should do it, not pip. "--no-python-version-warning", # If pip encounters a duplicate file path during its operations we don't want it to # prompt and we'd also like to know about this since it should never occur. We leverage # the pip global option: # --exists-action <action> # Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, # (a)bort. "--exists-action", "a", ] if not package_index_configuration or package_index_configuration.isolated: # Don't read PIP_ environment variables or pip configuration files like # `~/.config/pip/pip.conf`. pip_args.append("--isolated") # The max pip verbosity is -vvv and for pex it's -vvvvvvvvv; so we scale down by a factor # of 3. pip_verbosity = ENV.PEX_VERBOSE // 3 if pip_verbosity > 0: pip_args.append("-{}".format("v" * pip_verbosity)) else: pip_args.append("-q") if cache: pip_args.extend(["--cache-dir", cache]) else: pip_args.append("--no-cache-dir") command = pip_args + list(args) # N.B.: Package index options in Pep always have the same option names, but they are # registered as subcommand-specific, so we must append them here _after_ the pip subcommand # specified in `args`. if package_index_configuration: command.extend(package_index_configuration.args) env = package_index_configuration.env if package_index_configuration else {} with ENV.strip().patch( PEX_ROOT=cache or ENV.PEX_ROOT, PEX_VERBOSE=str(ENV.PEX_VERBOSE), **env ) as env: # Guard against API calls from environment with ambient PYTHONPATH preventing pip PEX # bootstrapping. See: https://github.com/pantsbuild/pex/issues/892 pythonpath = env.pop("PYTHONPATH", None) if pythonpath: TRACER.log( "Scrubbed PYTHONPATH={} from the pip PEX environment.".format(pythonpath), V=3 ) from pex.pex import PEX pip = PEX(pex=self._pip_pex_path, interpreter=interpreter) return Job( command=pip.cmdline(command), process=pip.run(args=command, env=env, blocking=False) )
def _spawn_pip_isolated( self, args, # type: Iterable[str] package_index_configuration=None, # type: Optional[PackageIndexConfiguration] cache=None, # type: Optional[str] interpreter=None, # type: Optional[PythonInterpreter] pip_verbosity=0, # type: int **popen_kwargs # type: Any ): # type: (...) -> Tuple[List[str], subprocess.Popen] pip_args = [ # We vendor the version of pip we want so pip should never check for updates. "--disable-pip-version-check", # If we want to warn about a version of python we support, we should do it, not pip. "--no-python-version-warning", # If pip encounters a duplicate file path during its operations we don't want it to # prompt and we'd also like to know about this since it should never occur. We leverage # the pip global option: # --exists-action <action> # Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, # (a)bort. "--exists-action", "a", ] python_interpreter = interpreter or PythonInterpreter.get() pip_args.extend( self._calculate_resolver_version_args( python_interpreter, package_index_configuration=package_index_configuration ) ) if not package_index_configuration or package_index_configuration.isolated: # Don't read PIP_ environment variables or pip configuration files like # `~/.config/pip/pip.conf`. pip_args.append("--isolated") # The max pip verbosity is -vvv and for pex it's -vvvvvvvvv; so we scale down by a factor # of 3. pip_verbosity = pip_verbosity or (ENV.PEX_VERBOSE // 3) if pip_verbosity > 0: pip_args.append("-{}".format("v" * pip_verbosity)) else: pip_args.append("-q") if cache: pip_args.extend(["--cache-dir", cache]) else: pip_args.append("--no-cache-dir") command = pip_args + list(args) # N.B.: Package index options in Pep always have the same option names, but they are # registered as subcommand-specific, so we must append them here _after_ the pip subcommand # specified in `args`. if package_index_configuration: command.extend(package_index_configuration.args) env = package_index_configuration.env if package_index_configuration else {} with ENV.strip().patch( PEX_ROOT=cache or ENV.PEX_ROOT, PEX_VERBOSE=str(ENV.PEX_VERBOSE), **env ) as env: # Guard against API calls from environment with ambient PYTHONPATH preventing pip PEX # bootstrapping. See: https://github.com/pantsbuild/pex/issues/892 pythonpath = env.pop("PYTHONPATH", None) if pythonpath: TRACER.log( "Scrubbed PYTHONPATH={} from the pip PEX environment.".format(pythonpath), V=3 ) from pex.pex import PEX pip = PEX(pex=self._pip_pex_path, interpreter=python_interpreter) # Pip has no discernable stdout / stderr discipline with its logging. Pex guarantees # stdout will only contain useable (parseable) data and all logging will go to stderr. # To uphold the Pex standard, force Pip to comply by re-directing stdout to stderr. # # See: # + https://github.com/pantsbuild/pex/issues/1267 # + https://github.com/pypa/pip/issues/9420 stdout = popen_kwargs.pop("stdout", sys.stderr.fileno()) return pip.cmdline(command), pip.run( args=command, env=env, blocking=False, stdout=stdout, **popen_kwargs )