diff --git a/dvc/command/base.py b/dvc/command/base.py index 9391418f9..78eb1a013 100644 --- a/dvc/command/base.py +++ b/dvc/command/base.py @@ -57,3 +57,13 @@ class CmdBaseNoRepo(CmdBase): def do_run(self): return self.run() + + +def fix_plumbing_subparsers(subparsers): + # metavar needs to be explicitly set in order to hide plumbing subcommands + # from the 'positional arguments' choices list + # see: https://bugs.python.org/issue22848 + cmds = [ + cmd for cmd, parser in subparsers.choices.items() if parser.add_help + ] + subparsers.metavar = "{{{}}}".format(",".join(cmds)) diff --git a/dvc/command/experiments/__init__.py b/dvc/command/experiments/__init__.py index 93b7c44aa..d8ff7e825 100644 --- a/dvc/command/experiments/__init__.py +++ b/dvc/command/experiments/__init__.py @@ -1,10 +1,15 @@ import argparse -from dvc.command.base import append_doc_link, fix_subparsers +from dvc.command.base import ( + append_doc_link, + fix_plumbing_subparsers, + fix_subparsers, +) from dvc.command.experiments import ( apply, branch, diff, + exec_run, gc, init, ls, @@ -19,6 +24,7 @@ SUB_COMMANDS = [ apply, branch, diff, + exec_run, gc, init, ls, @@ -51,3 +57,4 @@ def add_parser(subparsers, parent_parser): fix_subparsers(experiments_subparsers) for cmd in SUB_COMMANDS: cmd.add_parser(experiments_subparsers, parent_parser) + fix_plumbing_subparsers(experiments_subparsers) diff --git a/dvc/command/experiments/exec_run.py b/dvc/command/experiments/exec_run.py new file mode 100644 index 000000000..9e515b7b2 --- /dev/null +++ b/dvc/command/experiments/exec_run.py @@ -0,0 +1,41 @@ +import logging + +from dvc.command.base import CmdBaseNoRepo + +logger = logging.getLogger(__name__) + + +class CmdExecutorRun(CmdBaseNoRepo): + """Run an experiment executor.""" + + def run(self): + from dvc.repo.experiments.executor.base import ( + BaseExecutor, + ExecutorInfo, + ) + from dvc.utils.serialize import load_json + + info = ExecutorInfo.from_dict(load_json(self.args.infofile)) + BaseExecutor.reproduce( + info=info, + rev="", + queue=None, + log_level=logger.getEffectiveLevel(), + ) + return 0 + + +def add_parser(experiments_subparsers, parent_parser): + EXEC_RUN_HELP = "Run an experiment executor." + exec_run_parser = experiments_subparsers.add_parser( + "exec-run", + parents=[parent_parser], + description=EXEC_RUN_HELP, + add_help=False, + ) + exec_run_parser.add_argument( + "--infofile", + help="Path to executor info file", + default=None, + ) + exec_run_parser.set_defaults(func=CmdExecutorRun)