使用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' 指定一个变量来保存用户选择的子命令。然后为每个子命令(如 addremove)添加单独的参数。

处理子命令选项

除了位置参数,我们还可以为每个子命令添加可选参数。下面是一个示例,展示如何为子命令添加选项:

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 提供了强大的功能来解析复杂的命令行参数,是编写复杂脚本和工具的理想选择。