将 subparser 命令放在参数的开头

Put subparser command at the beginning of arguments

我想用 argparse 为我的带有子命令的脚本创建一个界面;因此,如果我的脚本是 script.py,我想将其命名为 python script.py command --foo bar,其中 command 是 N 个可能的自定义命令之一。

问题是,我已经尝试寻找解决方案here on Whosebug,但似乎我尝试的一切都没有用。

我目前拥有的是:

parser = argparse.ArgumentParser()

parser.add_argument("-x", required=True)
parser.add_argument("-y", required=True)
parser.add_argument("-f", "--files", nargs="+", required=True)

# subparsers for commands
subparsers = parser.add_subparsers(title="Commands", dest="command")
subparsers.required = True

summary_parser = subparsers.add_parser("summary", help="help of summary command")
args = parser.parse_args("-x 1 -y 2 -f a/path another/path".split())

我得到了这个错误,它应该是:script.py: error: the following arguments are required: command

args = parser.parse_args("summary -x 1 -y 2 -f a/path another/path".split())

我得到了这个错误,我不应该有:script.py: error: the following arguments are required: -x, -y, -f/--files

args = parser.parse_args("-x 1 -f a/path another/path -y 2 summary".split())

我的问题是,我必须如何设置解析器才能具有 script.py <command> <args> 行为?每个命令共享相同的参数,因为创建特定对象需要它们,但同时每个命令可以也需要其他参数。

创建另一个解析器帮助我得到了我想要的东西。 根解析器应该添加所有可选参数 - 并且还有 add_help=False,以避免帮助消息冲突 - 然后将创建另一个解析器 - parser2,有很多幻想。

第二个解析器会有子解析器,它们都需要指定为parents根解析器。

parser = argparse.ArgumentParser(add_help=False)

parser.add_argument() ...

parser2 = argparse.ArgumentParser()
subparsers = parser2.add_subparsers(title="Commands", dest="command")
subparsers.required = True

summary_parser = subparsers.add_parser("summary", parents=[parser])
summary_parser.add_argument("v", "--verbose", action="store_true")

# parse args
args = parser2.parse_args()

现在输出将是这样的:

usage: script.py [-h] {summary} ...

optional arguments:
  -h, --help  show this help message and exit

Commands:
  {summary}
    summary   For each report print its summary, then exit
usage: script.py summary [-h] -x X -y Y -f FILES [FILES ...] [-v]

optional arguments:
  -h, --help            show this help message and exit
  -x X
  -y Y
  -f FILES [FILES ...], --files FILES [FILES ...]
  -v, --verbose