| import sys | |
| from optparse import Values | |
| from typing import List | |
| from pip._internal.cli import cmdoptions | |
| from pip._internal.cli.base_command import Command | |
| from pip._internal.cli.status_codes import SUCCESS | |
| from pip._internal.operations.freeze import freeze | |
| from pip._internal.utils.compat import stdlib_pkgs | |
| DEV_PKGS = {"pip", "setuptools", "distribute", "wheel"} | |
| class FreezeCommand(Command): | |
| """ | |
| Output installed packages in requirements format. | |
| packages are listed in a case-insensitive sorted order. | |
| """ | |
| usage = """ | |
| %prog [options]""" | |
| log_streams = ("ext://sys.stderr", "ext://sys.stderr") | |
| def add_options(self) -> None: | |
| self.cmd_opts.add_option( | |
| "-r", | |
| "--requirement", | |
| dest="requirements", | |
| action="append", | |
| default=[], | |
| metavar="file", | |
| help=( | |
| "Use the order in the given requirements file and its " | |
| "comments when generating output. This option can be " | |
| "used multiple times." | |
| ), | |
| ) | |
| self.cmd_opts.add_option( | |
| "-l", | |
| "--local", | |
| dest="local", | |
| action="store_true", | |
| default=False, | |
| help=( | |
| "If in a virtualenv that has global access, do not output " | |
| "globally-installed packages." | |
| ), | |
| ) | |
| self.cmd_opts.add_option( | |
| "--user", | |
| dest="user", | |
| action="store_true", | |
| default=False, | |
| help="Only output packages installed in user-site.", | |
| ) | |
| self.cmd_opts.add_option(cmdoptions.list_path()) | |
| self.cmd_opts.add_option( | |
| "--all", | |
| dest="freeze_all", | |
| action="store_true", | |
| help=( | |
| "Do not skip these packages in the output:" | |
| " {}".format(", ".join(DEV_PKGS)) | |
| ), | |
| ) | |
| self.cmd_opts.add_option( | |
| "--exclude-editable", | |
| dest="exclude_editable", | |
| action="store_true", | |
| help="Exclude editable package from output.", | |
| ) | |
| self.cmd_opts.add_option(cmdoptions.list_exclude()) | |
| self.parser.insert_option_group(0, self.cmd_opts) | |
| def run(self, options: Values, args: List[str]) -> int: | |
| skip = set(stdlib_pkgs) | |
| if not options.freeze_all: | |
| skip.update(DEV_PKGS) | |
| if options.excludes: | |
| skip.update(options.excludes) | |
| cmdoptions.check_list_path_option(options) | |
| for line in freeze( | |
| requirement=options.requirements, | |
| local_only=options.local, | |
| user_only=options.user, | |
| paths=options.path, | |
| isolated=options.isolated_mode, | |
| skip=skip, | |
| exclude_editable=options.exclude_editable, | |
| ): | |
| sys.stdout.write(line + "\n") | |
| return SUCCESS | |