在 Python 的 argparse
模块中,可以创建一个主解析器/父解析器(main parser)和多个子解析器(sub-parsers)。其中,main parser 中定义作用于整个项目的解析器,sub-parsers 中定义特定于某一些功能的子解析器。其中:
- main parser 中的选项称作
global option
,这些全局选项作用于整个项目 - sub-parsers 中的选项称作
sub option
,子选项的作用范围限制在子解析器内
通过使用一个主解析器和多个子解析器,能够创建更加灵活的命令行接口。
使用示例
下面的示例代码中,定义了一个主解析器 parser 和两个子解析器 parser_a 和 parser_b。
import argparse
# Set up the main parser
parser = argparse.ArgumentParser(description='A program with sub-commands') # 1
parser.add_argument('--verbose', action='store_true', help='increase output verbosity') # 2
# Set up subparsers for the different sub-commands
subparsers = parser.add_subparsers(title='sub-commands', dest='subcommand', description='valid subcommands', help='additional help') # 3
# Add subparsers for each sub-command
parser_a = subparsers.add_parser('command_a', help='description of command_a') # 4
parser_a.add_argument('--option_a', type=int, help='description of option_a') # 5
parser_b = subparsers.add_parser('command_b', help='description of command_b') # 6
parser_b.add_argument('--option_b', type=float, help='description of option_b') # 7
# Add subparsers for additional sub-commands here
# Parse the command-line arguments
args = parser.parse_args() # 8
if args.verbose:
print('Verbose mode enabled')
# Check which sub-command was specified and handle its options
if args.subcommand == 'command_a': # 9
if args.option_a:
print(f'command_a was run with option_a={args.option_a}')
else:
print('command_a was run')
elif args.subcommand == 'command_b':
if args.option_b:
print(f'command_b was run with option_b={args.option_b}')
else:
print('command_b was run')
- 在
1
处,通过argparse.ArgumentParser()
定义主解析器 parser - 在
2
处,通过.add_argument()
方法为主解析器添加一个全局选项:–verbose - 在
3
处,通过.add_subparsers()
方法创建子解析器 subparsers,作为主解析器 parser 的子解析器,每个 subparser 都通过不同的子命令行指示(参数dest
) - 在
4
和6
处,通过subparsers.add_parser()
创建了两个子解析器 parser_a 和 parser_b - 在
5
和7
处,通过add_argument()
为子解析器分别添加子选项 –option_a 和 –option_b - 在
8
处,使用parser.parse_args()
对命令行参数进行解析 - 在
9
处,args.subcommand
即3
处的参数dest
,通过子解析器的名称进行判断
命令行执行程序:
$ python my_tool.py command_a --option_a 42
args.subcommand
指定了当前使用哪个子解析器,上面的例子中,command_a 指定子解析器为 parser_a,同时指定了解析器 parser_a 的选项 –option_a。输出:
command_a was run with option_a=42
在命令行同时使用 –verbose 和 –option_a:
$ python my_tool.py --verbose command_a --option_a 42
此时程序开启 verbose 模式,同时执行子解析器 parser_a,输出:
Verbose mode enabled
command_a was run with option_a=42