﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
35926	Support capturing the remainder of a command-line arguments in BaseCommand	Daniel Quinn		"I wanted to write a management command that would accept a few known arguments and then capture the remaining arbitrary arguments passed as a separate value.  For example:


{{{
./manage.py mycommand --expected=argument --something-arbitrary -x -y -z
}}}

So `--expected-argument` would be defined in `.add_arguments()`, but the other args would just be available as something like `options[""remainder""]` or whatever.

This is usually done by calling `parse_known_args()` rather than the more common `.parse_args()`, but unfortunately there's currently no way to cleanly indicate this with BaseCommand.  The only way seems to be to copy/paste the entirety of `BaseCommand.run_from_argv()` and then change where`.parse_args()` is invoked:

{{{
    def run_from_argv(self, argv):
        """"""
        Copypasta from the parent class, so I can change `.parse_args()` to
        `.parse_known_args()`.
        """"""

        self._called_from_command_line = True
        parser = self.create_parser(argv[0], argv[1])

        # Change --------------------------------------------------------------
        options, remainder = parser.parse_known_args(argv[2:])
        cmd_options = vars(options)
        cmd_options[""remainder""] = remainder
        # /Change -------------------------------------------------------------

        # Move positional args out of options to mimic legacy optparse
        args = cmd_options.pop(""args"", ())
        handle_default_options(options)
        try:
            self.execute(*args, **cmd_options)
        except CommandError as e:
            if options.traceback:
                raise

            # SystemCheckError takes care of its own formatting.
            if isinstance(e, SystemCheckError):
                self.stderr.write(str(e), lambda x: x)
            else:
                self.stderr.write(""%s: %s"" % (e.__class__.__name__, e))
            sys.exit(e.returncode)
        finally:
            try:
                connections.close_all()
            except ImproperlyConfigured:
                # Ignore if connections aren't setup at this point (e.g. no
                # configured settings).
                pass
}}}

Obviously that's not ideal.

One option might be to just use `.parse_known_args()` and then allow the user to indicate whether they want to capture the remainder or not, and if so, as what attribute, but I have no strong feelings about implementation."	New feature	closed	Core (Management commands)	dev	Normal	wontfix	unknown args		Unreviewed	0	0	0	0	0	0
