使用argparse获取命令行子命令
在Python中,argparse
是一个强大的库,用于处理命令行参数和选项。通过 argparse
,可以轻松地创建复杂的命令行工具。本文将详细讲解如何使用 argparse
获取和处理命令行子命令。
基本用法
首先,我们来看一个简单的示例,展示如何创建和解析基本的命令行参数:
import argparse
parser = argparse.ArgumentParser(description='这是一个简单的命令行工具')
parser.add_argument('filename', type=str, help='文件名')
args = parser.parse_args()
print(f'处理文件: {args.filename}')
在这个示例中,ArgumentParser
对象用于定义程序的描述信息。通过 add_argument
方法添加一个位置参数 filename
,最后使用 parse_args()
解析命令行输入。
添加子命令
在实际应用中,我们经常需要创建带有多个子命令的工具。例如,Git 命令就是典型的带有多个子命令(如 git clone
, git pull
)的例子。下面是一个简单的示例,展示如何使用 argparse
来处理子命令。
import argparse
# 创建主解析器
parser = argparse.ArgumentParser(description='这是一个带有子命令的工具')
subparsers = parser.add_subparsers(dest='command', help='可用的命令')
# 创建 "add" 子命令解析器
parser_add = subparsers.add_parser('add', help='添加新项目')
parser_add.add_argument('item', type=str, help='要添加的项目名称')
# 创建 "remove" 子命令解析器
parser_remove = subparsers.add_parser('remove', help='删除项目')
parser_remove.add_argument('item', type=str, help='要删除的项目名称')
# 解析命令行参数
args = parser.parse_args()
# 根据子命令执行相应的操作
if args.command == 'add':
print(f'添加项目: {args.item}')
elif args.command == 'remove':
print(f'删除项目: {args.item}')
else:
print('未知命令')
在这个示例中,我们使用 add_subparsers
方法创建了一个子解析器对象,并通过 dest='command'
指定一个变量来保存用户选择的子命令。然后为每个子命令(如 add
和 remove
)添加单独的参数。
处理子命令选项
除了位置参数,我们还可以为每个子命令添加可选参数。下面是一个示例,展示如何为子命令添加选项:
import argparse
# 创建主解析器
parser = argparse.ArgumentParser(description='这是一个带有子命令和选项的工具')
subparsers = parser.add_subparsers(dest='command', help='可用的命令')
# 创建 "add" 子命令解析器
parser_add = subparsers.add_parser('add', help='添加新项目')
parser_add.add_argument('item', type=str, help='要添加的项目名称')
parser_add.add_argument('--priority', type=int, default=1, help='项目的优先级')
# 创建 "remove" 子命令解析器
parser_remove = subparsers.add_parser('remove', help='删除项目')
parser_remove.add_argument('item', type=str, help='要删除的项目名称')
parser_remove.add_argument('--force', action='store_true', help='强制删除项目')
# 解析命令行参数
args = parser.parse_args()
# 根据子命令执行相应的操作
if args.command == 'add':
print(f'添加项目: {args.item}, 优先级: {args.priority}')
elif args.command == 'remove':
force_flag = "强制" if args.force else ""
print(f'{force_flag}删除项目: {args.item}')
else:
print('未知命令')
在这个示例中,add
子命令添加了一个可选参数 --priority
,而 remove
子命令添加了一个布尔类型的选项 --force
。
总结
通过本文的学习,我们掌握了如何使用 argparse
创建带有子命令和选项的命令行工具。argparse
提供了强大的功能来解析复杂的命令行参数,是编写复杂脚本和工具的理想选择。