【一篇入门】python命令行选项argparse模块详解

1. 引言

在Python编程中,我们经常需要处理命令行参数,例如从命令行中获取用户输入,设置程序的行为,或者调整不同模式下的行为。而argparse是一个Python标准库,用于解析命令行参数并帮助开发者构建灵活的命令行接口。

本文将介绍argparse的基本用法,帮助您快速入门并开始在自己的代码中使用该库。

2. 安装和导入argparse

在开始之前,您需要确保已经安装了argparse库。大多数情况下,argparse已经随着Python一起安装好了,但如果没有的话,您可以使用以下命令进行安装:

pip install argparse

argparse安装完成后,您可以在代码中导入它:

import argparse

3. 创建ArgumentParser对象

要使用argparse库,第一步就是创建一个ArgumentParser对象。该对象将帮助您定义命令行接口的外观和行为。

# 创建ArgumentParser对象
parser = argparse.ArgumentParser(description="An example program using argparse")

在上述代码中,我们创建了一个名为parserArgumentParser对象,并提供了一个描述该程序目的的简短描述。

4. 添加位置参数

位置参数是在命令行中必须提供的参数,它们通常用于传递位置相关的信息或必需的参数值。

argparse中,要添加位置参数,我们使用add_argument()方法,并指定参数的名称和一些帮助信息。

# 添加位置参数
parser.add_argument("name", help="Enter your name")

在上述代码中,我们添加了一个名为name的位置参数,并提供了一个简短的帮助信息。位置参数的值将在使用该程序时从命令行中获取。

5. 添加可选参数

可选参数是在命令行中提供的,但不是必须的参数。它们通常用于配置程序行为,设置程序的不同模式,或者指定一些可选的参数值。

类似于位置参数,我们可以使用add_argument()方法来添加可选参数。我们可以指定短选项(使用单个破折号-)或长选项(使用双破折号--),并提供一些帮助信息。

# 添加可选参数
parser.add_argument("-g", "--gender", choices=["male", "female"], help="Enter your gender")

在上述代码中,我们添加了一个名为gender的可选参数。我们指定了两个选择项,选择从malefemale中进行。可选参数的值将在使用该程序时从命令行中获取。

6. 解析命令行参数

在定义了所有的参数后,我们需要解析命令行上提供的参数。这将把命令行参数转换为Python对象,并和之前定义的参数相关联。

# 解析命令行参数
args = parser.parse_args()

在上述代码中,我们使用parse_args()方法来解析命令行参数,并将解析结果存储在args变量中。

7. 使用解析结果

通过解析命令行参数,我们可以使用args变量来访问并使用这些参数的值。

# 打印解析结果
print("Name:", args.name)
print("Gender:", args.gender)

在上述代码中,我们通过args.nameargs.gender访问了解析后的参数值,并打印输出。

8. 完善示例程序

以下是一个完整的示例程序,演示了如何使用argparse解析命令行参数并使用这些参数。

import argparse

# 创建ArgumentParser对象
parser = argparse.ArgumentParser(description="An example program using argparse")

# 添加位置参数
parser.add_argument("name", help="Enter your name")

# 添加可选参数
parser.add_argument("-g", "--gender", choices=["male", "female"], help="Enter your gender")

# 解析命令行参数
args = parser.parse_args()

# 打印解析结果
print("Name:", args.name)
print("Gender:", args.gender)

您可以在命令行中执行以下命令来运行这个示例程序:

python my_program.py John -g male

输出结果将类似于:

Name: John
Gender: male

注意

可以对位置参数设置choices,以限制用户只能从指定的选项中选择一个值。也可以对可选参数不设置choices,而是允许用户自定义。如果您在添加可选参数时未设置choices参数,那么用户可以自由地提供他们想要的值作为该参数的取值,灵活运用。

# 添加位置参数
parser.add_argument("name", choices=["Alice", "Bob", "Charlie"], help="Enter your name")
# 添加可选参数
parser.add_argument("-g", "--gender", help="Enter your gender")

9. 进阶内容

argparse还提供了一些进阶的功能,以帮助处理更复杂的命令行参数。在掌握了基本的使用方法后,您可以进一步探索这些功能以满足特定需求。

ArgumentParser 的参数

参数描述
prog程序的名称默认值:os.path.basename(sys.argv[0])
usage描述程序用途的字符串默认值:从添加到解析器的参数生成
description要在参数帮助信息之前显示的文本默认值:无文本
epilog要在参数帮助信息之后显示的文本默认值:无文本
parents一个 ArgumentParser 对象的列表,它们的参数也应包含在内
formatter_class用于自定义帮助文档输出格式的类
prefix_chars可选参数的前缀字符集合默认值:‘-’
fromfile_prefix_chars当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合默认值:None
argument_default参数的全局默认值默认值:None
conflict_handler解决冲突选项的策略通常是不必要的
add_help为解析器添加一个 -h/–help 选项默认值:True
allow_abbrev如果缩写是无歧义的,则允许缩写长选项默认值:True
exit_on_error决定当错误发生时是否让 ArgumentParser 附带错误信息退出默认值:True

add_argument() 的参数

名称描述
action指明应当如何处理一个参数‘store’, ‘store_const’, ‘store_true’, ‘append’, ‘append_const’, ‘count’, ‘help’, ‘version’
choices将值限制为指定的可选项集合[‘foo’, ‘bar’], range(1, 10) 或 Container 实例
const存储一个常量值
default当未提供某个参数时要使用的默认值默认为 None
dest指定要在结果命名空间中使用的属性名称
help某个参数的帮助消息
metavar要在帮助中显示的参数替代显示名称
nargs参数可被使用的次数int, ‘?’, ‘*’, ‘+’
required指明某个参数是必需的还是可选的True 或 False
type自动将参数转换为给定的类型int, float, argparse.FileType(‘w’) 或可调用函数

参数默认值(Default Values)

可以为参数设置默认值,并使用default参数来指定默认值;也可以通过设置default=argparse.SUPPRESS来隐藏参数默认值。

import argparse

# 创建ArgumentParser对象
parser = argparse.ArgumentParser()

# 添加参数并设置默认值
parser.add_argument('-l', '--limit', type=int, default=10, help='Set limit')

# 解析命令行参数
args = parser.parse_args()

# 打印解析结果
print('Limit:', args.limit)

在这个示例中,我们将参数limit的默认值设置为10。如果用户在命令行中未提供该参数,它将被解析为默认值10。

自定义帮助信息(Custom Help Messages)

自定义帮助信息允许您自己定义参数的帮助信息和显示格式。

import argparse

# 创建ArgumentParser对象
parser = argparse.ArgumentParser(prog='my_program', description='An example program',
                                 epilog='Please enjoy using my program!')

# 添加参数
parser.add_argument('name', help='Enter your name')

# 解析命令行参数
args = parser.parse_args()

# 打印解析结果
print('Name:', args.name)

在上述示例中,我们通过指定prog参数为my_program来自定义程序名称。我们还在description参数中提供了一个简短的描述信息,并在epilog参数中添加了一条结语。当用户查看帮助信息时,将显示您提供的自定义信息。

使用文件作为参数

argparse还能够让您将文件名作为参数接受,并自动读取文件的内容作为参数值。

import argparse

# 创建ArgumentParser对象,将文件名作为参数
parser = argparse.ArgumentParser()

# 添加参数
parser.add_argument('-f', '--file', type=argparse.FileType('r'), help='Input file')

# 解析命令行参数
args = parser.parse_args()

# 读取文件内容并打印
if args.file:
    content = args.file.read()
    print('File content:\n', content)
    args.file.close()

在上述示例中,我们将argparse.FileType('r')指定为type参数,它以只读模式打开文件,当参数被解析后,可以通过args.file来访问文件对象。我们使用read()方法读取文件内容,并打印出来。最后,我们必须确保手动关闭文件对象。

多个值的参数(Multi-valued Arguments)

argparse允许接受多个值的参数,用户可以在命令行中多次提供该参数,并将其收集到一个列表中。

import argparse

# 创建ArgumentParser对象
parser = argparse.ArgumentParser()

# 添加可接受多个值的参数
parser.add_argument('-n', '--numbers', type=int, nargs='+', help='Enter numbers')

# 解析命令行参数
args = parser.parse_args()

# 打印解析结果
print('Numbers:', args.numbers)

在这个示例中,通过设置nargs='+',我们指示参数numbers可以接受多个值,并将它们收集到列表args.numbers中。

子命令(Sub-commands)

子命令允许您为程序创建不同的子命令,每个子命令都有自己的参数和行为,类似于git命令中的commit、checkout、branch等。

import argparse

# 创建ArgumentParser对象和子命令解析器
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

# 创建第一个子命令的ArgumentParser对象
command1_parser = subparsers.add_parser('command1')
command1_parser.add_argument('name', help='Enter your name')

# 创建第二个子命令的ArgumentParser对象
command2_parser = subparsers.add_parser('command2')
command2_parser.add_argument('age', type=int, help='Enter your age')

# 解析命令行参数
args = parser.parse_args()

# 根据选择的子命令执行对应的逻辑
if hasattr(args, 'name'):
    print('Hello,', args.name)
elif hasattr(args, 'age'):
    print('Your age is', args.age)

上述示例中,我们创建了一个子命令解析器subparsers,然后创建了两个子命令command1command2ArgumentParser对象,分别添加了nameage作为各自子命令的参数。通过检查命名空间args中相应的属性,我们可以判断用户选择了哪个子命令,并执行相应的逻辑。

互斥参数(Mutually Exclusive Arguments)

互斥参数允许您定义一组参数中只能设置其中一个参数的情况。

import argparse

# 创建ArgumentParser对象
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()

# 添加互斥参数
group.add_argument('-a', '--apple', action='store_true', help='Add apple')
group.add_argument('-b', '--banana', action='store_true', help='Add banana')

# 解析命令行参数
args = parser.parse_args()

# 根据参数值执行对应的逻辑
if args.apple:
    print('Apple added')
elif args.banana:
    print('Banana added')
else:
    print('No fruit added')

在上述示例中,我们使用add_mutually_exclusive_group()方法创建了一个互斥组。然后,我们为互斥组添加了两个互斥参数applebanana,表示只允许选择其中一个。通过检查命名空间args中相应的属性,我们可以确定用户选择了哪个参数,并执行相应的逻辑。

解析复杂类型参数

argparse还可以解析和验证复杂类型的参数,例如JSON、CSV等。

import argparse
import json

# 自定义解析函数,解析JSON参数
def parse_json(value):
    try:
        return json.loads(value)
    except ValueError:
        raise argparse.ArgumentTypeError("Invalid JSON format")

# 创建ArgumentParser对象,指定自定义解析函数
parser = argparse.ArgumentParser()

# 添加参数
parser.add_argument('-j', '--json', type=parse_json, help='Enter JSON data')

# 解析命令行参数
args = parser.parse_args()

# 打印解析结果
print('JSON data:', args.json)

上述示例中,我们编写了一个自定义的解析函数parse_json(),它接受一个值作为字符串,并查看该字符串是否为有效的JSON格式。如果是有效的JSON,函数将使用json.loads()方法解析该值,并将结果返回。如果不是有效的JSON,函数将引发一个argparse.ArgumentTypeError的异常,该异常将被argparse捕获并显示错误消息。

10. 参考资料

  • 22
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值