将 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
。
- 如果我把命令放在最后,因为
-f
而改变参数的顺序,它会起作用。
args = parser.parse_args("-x 1 -f a/path another/path -y 2 summary".split())
如果我在子解析器中添加 parents
关键字,所以用 summary_parser = subparsers.add_parser("summary", help=HELP_CMD_SUMMARY, parents=[parser], add_help=False)
替换 summary_parser
行,然后我得到:
script.py summary: error: the following arguments are required: command
当 summary
在所有其他参数前面时;
script.py summary: error: the following arguments are required: -x, -y, -f/--files, command
当 summary
位于参数的末尾时。
我的问题是,我必须如何设置解析器才能具有 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
我想用 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
。
- 如果我把命令放在最后,因为
-f
而改变参数的顺序,它会起作用。
args = parser.parse_args("-x 1 -f a/path another/path -y 2 summary".split())
如果我在子解析器中添加
parents
关键字,所以用summary_parser = subparsers.add_parser("summary", help=HELP_CMD_SUMMARY, parents=[parser], add_help=False)
替换summary_parser
行,然后我得到:script.py summary: error: the following arguments are required: command
当summary
在所有其他参数前面时;script.py summary: error: the following arguments are required: -x, -y, -f/--files, command
当summary
位于参数的末尾时。
我的问题是,我必须如何设置解析器才能具有 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