Path: blob/main/test/lib/python3.9/site-packages/pip/_internal/commands/download.py
4804 views
import logging1import os2from optparse import Values3from typing import List45from pip._internal.cli import cmdoptions6from pip._internal.cli.cmdoptions import make_target_python7from pip._internal.cli.req_command import RequirementCommand, with_cleanup8from pip._internal.cli.status_codes import SUCCESS9from pip._internal.operations.build.build_tracker import get_build_tracker10from pip._internal.utils.misc import ensure_dir, normalize_path, write_output11from pip._internal.utils.temp_dir import TempDirectory1213logger = logging.getLogger(__name__)141516class DownloadCommand(RequirementCommand):17"""18Download packages from:1920- PyPI (and other indexes) using requirement specifiers.21- VCS project urls.22- Local project directories.23- Local or remote source archives.2425pip also supports downloading from "requirements files", which provide26an easy way to specify a whole environment to be downloaded.27"""2829usage = """30%prog [options] <requirement specifier> [package-index-options] ...31%prog [options] -r <requirements file> [package-index-options] ...32%prog [options] <vcs project url> ...33%prog [options] <local project path> ...34%prog [options] <archive url/path> ..."""3536def add_options(self) -> None:37self.cmd_opts.add_option(cmdoptions.constraints())38self.cmd_opts.add_option(cmdoptions.requirements())39self.cmd_opts.add_option(cmdoptions.no_deps())40self.cmd_opts.add_option(cmdoptions.global_options())41self.cmd_opts.add_option(cmdoptions.no_binary())42self.cmd_opts.add_option(cmdoptions.only_binary())43self.cmd_opts.add_option(cmdoptions.prefer_binary())44self.cmd_opts.add_option(cmdoptions.src())45self.cmd_opts.add_option(cmdoptions.pre())46self.cmd_opts.add_option(cmdoptions.require_hashes())47self.cmd_opts.add_option(cmdoptions.progress_bar())48self.cmd_opts.add_option(cmdoptions.no_build_isolation())49self.cmd_opts.add_option(cmdoptions.use_pep517())50self.cmd_opts.add_option(cmdoptions.no_use_pep517())51self.cmd_opts.add_option(cmdoptions.check_build_deps())52self.cmd_opts.add_option(cmdoptions.ignore_requires_python())5354self.cmd_opts.add_option(55"-d",56"--dest",57"--destination-dir",58"--destination-directory",59dest="download_dir",60metavar="dir",61default=os.curdir,62help="Download packages into <dir>.",63)6465cmdoptions.add_target_python_options(self.cmd_opts)6667index_opts = cmdoptions.make_option_group(68cmdoptions.index_group,69self.parser,70)7172self.parser.insert_option_group(0, index_opts)73self.parser.insert_option_group(0, self.cmd_opts)7475@with_cleanup76def run(self, options: Values, args: List[str]) -> int:7778options.ignore_installed = True79# editable doesn't really make sense for `pip download`, but the bowels80# of the RequirementSet code require that property.81options.editables = []8283cmdoptions.check_dist_restriction(options)8485options.download_dir = normalize_path(options.download_dir)86ensure_dir(options.download_dir)8788session = self.get_default_session(options)8990target_python = make_target_python(options)91finder = self._build_package_finder(92options=options,93session=session,94target_python=target_python,95ignore_requires_python=options.ignore_requires_python,96)9798build_tracker = self.enter_context(get_build_tracker())99100directory = TempDirectory(101delete=not options.no_clean,102kind="download",103globally_managed=True,104)105106reqs = self.get_requirements(args, options, finder, session)107108preparer = self.make_requirement_preparer(109temp_build_dir=directory,110options=options,111build_tracker=build_tracker,112session=session,113finder=finder,114download_dir=options.download_dir,115use_user_site=False,116verbosity=self.verbosity,117)118119resolver = self.make_resolver(120preparer=preparer,121finder=finder,122options=options,123ignore_requires_python=options.ignore_requires_python,124py_version_info=options.python_version,125)126127self.trace_basic_info(finder)128129requirement_set = resolver.resolve(reqs, check_supported_wheels=True)130131downloaded: List[str] = []132for req in requirement_set.requirements.values():133if req.satisfied_by is None:134assert req.name is not None135preparer.save_linked_requirement(req)136downloaded.append(req.name)137if downloaded:138write_output("Successfully downloaded %s", " ".join(downloaded))139140return SUCCESS141142143