命令行参数解析神器:深入剖析Python中的argparse模块

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 命令行参数解析神器:深入剖析Python中的argparse模块

😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦!😄


✨座右铭:宝剑锋从磨砺出,梅花香自苦寒来。


⛪️个人主页:点击进入博客主页


🚀欢迎大家浏览博主的文章!在阅读过程中,如果发现需要纠正的地方,请不吝指出,愿能与诸君共同进步!




正文


🍭 命令行参数解析神器:深入剖析Python中的argparse模块


argparse是一个用于解析命令行参数和选项的python标准库模块。它可以让你轻松地编写用户友好的命令行界面,定义你的程序需要的参数,自动生成帮助和用法信息,以及处理用户给出的无效参数。



在这篇博客中,我将介绍argparse的基本用法,以及一些高级功能,如子命令、互斥组、文件类型等。我将用丰富的例子和解释来帮助你理解和掌握argparse的使用方法。



🍭 一、一个最简单的示例


使用argparse,你可以指定程序所需的参数、选项以及如何解析它们。下面是一个基本的示例,演示了如何使用argparse来解析命令行参数:

import argparse
# 创建ArgumentParser对象
parser = argparse.ArgumentParser(description='这是一个使用argparse的示例程序')
# 添加位置参数
parser.add_argument('name', help='姓名')
parser.add_argument('age', type=int, help='年龄')
# 添加可选参数
parser.add_argument('--gender', choices=['male', 'female'], help='性别')
parser.add_argument('--height', type=float, help='身高')
# 解析命令行参数
args = parser.parse_args()
# 访问解析后的参数
print(f'姓名: {args.name}')
print(f'年龄: {args.age}')
print(f'性别: {args.gender}')
print(f'身高: {args.height}')


在上面的示例中,我们首先创建了一个ArgumentParser对象,并提供了一个描述性的文字作为参数。然后,我们添加了两个位置参数(name和age),并分别指定了它们的帮助文本。接下来,我们添加了两个可选参数(–gender和–height),并使用choices和type参数限制了它们的取值范围和类型。


最后,我们调用parse_args()方法来解析命令行参数,并将解析后的结果存储在args变量中。我们可以通过访问args对象的属性来获取解析后的参数值,并进行相应的处理。


例如,如果我们在命令行中运行上述代码并提供以下输入:

python my_program.py John 25 --gender male --height 1.75


输出将是:

姓名: John
年龄: 25
性别: male
身高: 1.75


或者在pycharm输入这些参数:


这样可以获得相同的结果:



如果不输入默认参数直接运行,会如下图的报错:

0306c6b45d0c450aab6932b24fa608d7.png




二 、详细参数讲解


🍭创建一个解析器


要使用argparse,首先你需要创建一个argparse.ArgumentParser的实例,它是一个包含参数规范和一些全局选项的容器。你可以在创建时传入一些参数,如程序名、描述、帮助信息等,来定制你的解析器。例如:


import argparse
# 创建一个解析器
parser = argparse.ArgumentParser(
    prog="myprog", # 程序名,默认为sys.argv[0]
    description="This is a program that does something", # 程序描述
    epilog="This is some text at the bottom of help" # 帮助信息底部的文本
)



添加参数


创建了一个解析器后,你需要用add_argument()方法来添加你想要解析的参数。argparse支持两种类型的参数:位置参数和可选参数。

位置参数是根据它们在命令行中出现的位置来识别的,它们通常是必须提供的参数。例如:

# 添加一个位置参数
parser.add_argument("filename", help="the name of the file to process")


可选参数是根据它们前面的短横线或双横线来识别的,它们通常是可以省略或指定不同值的参数。例如:

# 添加一个可选参数
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")

add_argument()方法可以接受很多参数来定制你的参数行为和属性,如类型、默认值、选项、必需性、帮助信息等。你可以查看[argparse文档][argparse教程]来了解更多细节。




解析参数

添加了所有想要解析的参数后,你可以用parse_args()方法来运行解析器,并将提取出来的数据放在一个argparse.Namespace对象中。例如:

# 解析参数
args = parser.parse_args()
# 使用参数
if args.verbose:
    print(f"Processing {args.filename} in verbose mode")
else:
    print(f"Processing {args.filename}")

如果用户给出了无效或不符合规范的参数,argparse会自动报错并退出程序。如果用户没有给出任何参数或给出了-h或–help选项,argparse会自动打印帮助信息并退出程序。



🍭子命令

有时候,你可能想要让你的程序支持不同的子命令,就像git或pip那样。例如:

$ git clone https://github.com/python/cpython.git
$ git status
$ git commit -m "some message"


要实现这个功能,你可以使用add_subparsers()方法来创建一个子解析器,并为每个子命令添加一个子解析器。例如:

# 创建一个主解析器
parser = argparse.ArgumentParser(description="A simple calculator")
# 创建一个子解析器
subparsers = parser.add_subparsers(help="sub-command help")
# 为每个子命令添加一个子解析器
parser_add = subparsers.add_parser("add", help="add two numbers")
parser_add.add_argument("x", type=int, help="the first number")
parser_add.add_argument("y", type=int, help="the second number")
parser_sub = subparsers.add_parser("sub", help="subtract two numbers")
parser_sub.add_argument("x", type=int, help="the first number")
parser_sub.add_argument("y", type=int, help="the second number")
parser_mul = subparsers.add_parser("mul", help="multiply two numbers")
parser_mul.add_argument("x", type=int, help="the first number")
parser_mul.add_argument("y", type=int, help="the second number")
parser_div = subparsers.add_parser("div", help="divide two numbers")
parser_div.add_argument("x", type=int, help="the first number")
parser_div.add_argument("y", type=int, help="the second number")
# 解析参数
args = parser.parse_args()
# 使用参数
if args.subcommand == "add":
    print(args.x + args.y)
elif args.subcommand == "sub":
    print(args.x - args.y)
elif args.subcommand == "mul":
    print(args.x * args.y)
elif args.subcommand == "div":
    print(args.x / args.y)



互斥组


有时候,你可能想要让你的程序只接受一些互斥的选项,即不能同时出现的选项。例如:

$ python3 prog.py -a
$ python3 prog.py -b
$ python3 prog.py -a -b # 错误


要实现这个功能,你可以使用add_mutually_exclusive_group()方法来创建一个互斥组,并为该组添加一些选项。例如:

# 创建一个解析器
parser = argparse.ArgumentParser(description="A simple program")
# 创建一个互斥组
group = parser.add_mutually_exclusive_group()
# 为该组添加一些选项
group.add_argument("-a", action="store_true")
group.add_argument("-b", action="store_true")
# 解析参数
args = parser.parse_args()
# 使用参数
if args.a:
    print("Option A is selected")
elif args.b:
    print("Option B is selected")
else:
    print("No option is selected")


文件类型

有时候,你可能想要让你的程序接受一个文件名作为参数,并自动打开或创建该文件。例如:

$ python3 prog.py input.txt output.txt



要实现这个功能,你可以使用argparse.FileType类来指定你的参数的类型,它会返回一个类似于open()函数返回的文件对象。例如:

# 创建一个解析器
parser = argparse.ArgumentParser(description="A simple program that reads from a file and writes to another file")
# 添加两个文件类型的参数
parser.add_argument("infile", type=argparse.FileType("r"), help="the input file")
parser.add_argument("outfile", type=argparse.FileType("w"), help="the output file")
# 解析参数
args = parser.parse_args()
# 使用参数
for line in args.infile:
    args.outfile.write(line.upper())




总结


argparse是Python标准库中一个强大而灵活的模块,用于解析命令行参数和生成美观的帮助文档。无论是简单的脚本还是复杂的应用程序,argparse都能帮助开发者轻松地处理各种命令行参数,并提供友好的用户界面。通过使用argparse,开发者可以定义参数的类型、默认值、限制条件以及互斥关系,从而确保命令行输入的合法性和一致性。无需编写繁琐的解析代码,argparse的简洁接口使得命令行参数的处理变得简单而愉快。


不仅如此,argparse还能自动生成详细的帮助文档,为用户提供清晰明了的命令行使用说明。在Python中,argparse被广泛应用于各种项目,成为处理命令行参数的首选工具。无论是初学者还是有经验的开发者,掌握argparse的使用技巧都将极大地提升命令行工具的质量和用户体验。

相关文章
|
2月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
49 0
|
27天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
34 2
|
1月前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
25 1
|
1月前
|
设计模式 测试技术 开发者
Python中的装饰器深度解析
【10月更文挑战第24天】在Python的世界中,装饰器是那些能够为函数或类“添彩”的魔法工具。本文将带你深入理解装饰器的概念、工作原理以及如何自定义装饰器,让你的代码更加优雅和高效。
|
2月前
|
XML 前端开发 数据格式
Beautiful Soup 解析html | python小知识
在数据驱动的时代,网页数据是非常宝贵的资源。很多时候我们需要从网页上提取数据,进行分析和处理。Beautiful Soup 是一个非常流行的 Python 库,可以帮助我们轻松地解析和提取网页中的数据。本文将详细介绍 Beautiful Soup 的基础知识和常用操作,帮助初学者快速入门和精通这一强大的工具。【10月更文挑战第11天】
65 2
|
2月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
2月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
35 4
|
2月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
377 3
|
2月前
|
网络协议 Python
IP地址探秘:识别与解析的Python之旅 🚀
《IP地址探秘:识别与解析的Python之旅》通过Python的`ipaddress`模块,轻松实现IP地址的分类(如单播、多播、私有、环回或公有)及子网内所有IP的生成,使网络管理更加便捷高效。示例代码直观展示了功能实现过程。
22 1
|
2月前
|
运维 安全 网络协议
Python 网络编程:端口检测与IP解析
本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。
46 0