”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 掌握 Python 的 argparse:初学者综合指南

掌握 Python 的 argparse:初学者综合指南

发布于2024-11-08
浏览:133

Mastering Python’s argparse: A Comprehensive Guide for Beginners

介绍

Python 的 argparse 模块是用于构建用户友好的命令行界面的强大工具。无论您是在开发简单的脚本还是复杂的应用程序,了解如何有效地使用 argparse 都可以显着提高程序的可用性。在这篇文章中,我将引导您了解掌握 argparse 所需了解的所有内容 - 从基本参数解析到高级功能和最佳实践。


什么是argparse?

argparse 模块提供了一种简单的方法来处理传递给 Python 脚本的命令行参数。它自动生成帮助消息,处理类型检查,并可以处理可选参数和位置参数。

为什么使用argparse?

  • 自动帮助信息:用户可以通过使用--help选项轻松了解如何运行您的程序。
  • 类型检查:您可以确保输入有效(例如,您期望的整数)。
  • 可读的命令行界面:使您的脚本更加专业和用户友好。

让我们从基础开始!


设置 argparse

要开始使用 argparse,您首先需要导入模块并创建一个 ArgumentParser 对象:

import argparse

parser = argparse.ArgumentParser(description="Demo script for argparse.")

此处的描述参数是可选的,有助于解释脚本的用途。当用户运行 --help 命令时它会显示。

位置参数

位置参数是 argparse 中最基本的参数类型。这些是必需的,并且必须以正确的顺序出现在命令中。

parser.add_argument("name", help="Your name")
args = parser.parse_args()
print(f"Hello, {args.name}!")

运行脚本:

$ python script.py Alice
Hello, Alice!

如果不提供 name 参数,argparse 将抛出错误:

$ python script.py
usage: script.py [-h] name
script.py: error: the following arguments are required: name

可选参数

可选参数,顾名思义,不是强制性的。这些通常以一两个破折号(- 或 --)开头,以将它们与位置参数区分开来。

parser.add_argument("-g", "--greeting", help="Custom greeting message", default="Hello")
args = parser.parse_args()
print(f"{args.greeting}, {args.name}!")

运行脚本:

$ python script.py Alice --greeting Hi
Hi, Alice!

默认参数确保在用户未提供选项时使用默认值:

$ python script.py Alice
Hello, Alice!

参数类型

默认情况下,所有参数都被视为字符串。但您可以指定您期望的参数类型。例如,如果您需要一个整数:

parser.add_argument("age", type=int, help="Your age")
args = parser.parse_args()
print(f"{args.name} is {args.age} years old.")

运行脚本:

$ python script.py Alice 25
Alice is 25 years old.

如果您提供无效类型(例如,需要整数的字符串),argparse 将自动显示错误:

$ python script.py Alice twenty-five
usage: script.py [-h] name age
script.py: error: argument age: invalid int value: 'twenty-five'

标志参数(布尔选项)

标志参数对于启用或禁用某些功能很有用。它们不接受任何值,而是充当开关。使用action="store_true"选项创建一个标志。

parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose mode")
args = parser.parse_args()

if args.verbose:
    print("Verbose mode is on.")

运行脚本:

$ python script.py Alice -v
Verbose mode is on.

如果不提供标志,则使用默认值 False:

$ python script.py Alice

短选项名称与长选项名称

argparse 允许您为同一参数定义短选项名称和长选项名称。例如:

parser.add_argument("-g", "--greeting", help="Custom greeting message")

您可以使用短版本 (-g) 或长版本 (--greeting):

$ python script.py Alice -g Hi
Hi, Alice!
$ python script.py Alice --greeting Hi
Hi, Alice!

默认值

在某些情况下,您可能需要为可选参数定义默认值。这可以确保即使缺少参数,您的程序也能正确运行。

parser.add_argument("-g", "--greeting", default="Hello", help="Greeting message")
args = parser.parse_args()
print(f"{args.greeting}, {args.name}!")

处理多个值

您还可以使用 nargs 指定接受多个值的参数。例如,要接受多个文件名:

parser.add_argument("files", nargs=" ", help="List of file names")
args = parser.parse_args()
print(f"Files to process: {args.files}")

运行脚本:

$ python script.py file1.txt file2.txt file3.txt
Files to process: ['file1.txt', 'file2.txt', 'file3.txt']

限制选择

您可以使用选项选项限制参数的可能值:

parser.add_argument("--format", choices=["json", "xml"], help="Output format")
args = parser.parse_args()
print(f"Output format: {args.format}")

运行脚本:

$ python script.py Alice --format json
Output format: json

如果用户提供了无效的选择,argparse 将抛出错误:

$ python script.py Alice --format csv
usage: script.py [-h] [--format {json,xml}] name
script.py: error: argument --format: invalid choice: 'csv' (choose from 'json', 'xml')

组合位置参数和可选参数

您可以在同一脚本中混合和匹配位置参数和可选参数。

parser.add_argument("name", help="Your name")
parser.add_argument("--greeting", help="Custom greeting", default="Hello")
parser.add_argument("--verbose", action="store_true", help="Enable verbose output")

args = parser.parse_args()

if args.verbose:
    print(f"Running in verbose mode...")

print(f"{args.greeting}, {args.name}!")

生成帮助消息

argparse 的最大优势之一是其内置的帮助消息生成器。当用户使用 -h 或 --help 标志运行脚本时,argparse 将自动显示参数及其描述。

$ python script.py -h
usage: script.py [-h] [--greeting GREETING] [--verbose] name

Demo script for argparse.

positional arguments:
  name             Your name

optional arguments:
  -h, --help       show this help message and exit
  --greeting GREETING
                   Custom greeting
  --verbose        Enable verbose output

子解析器:处理多个命令

如果您的脚本有多个子命令(例如 git commit、git push),您可以使用子解析器来处理它们。

parser = argparse.ArgumentParser(description="Git-like command-line tool")
subparsers = parser.add_subparsers(dest="command")

# Add "commit" subcommand
commit_parser = subparsers.add_parser("commit", help="Record changes to the repository")
commit_parser.add_argument("-m", "--message", help="Commit message", required=True)

# Add "push" subcommand
push_parser = subparsers.add_parser("push", help="Update remote refs")

args = parser.parse_args()

if args.command == "commit":
    print(f"Committing changes with message: {args.message}")
elif args.command == "push":
    print("Pushing changes to remote repository.")

最佳实践

以下是使用 argparse 时需要考虑的一些最佳实践:

  1. 始终提供帮助消息:使用 add_argument 中的帮助参数来描述每个选项的作用。
  2. 使用合理的默认值:在适当的情况下提供默认值,以确保顺利执行,而不需要所有参数。
  3. 验证输入:使用选择和类型来确保用户提供有效的输入。
  4. 保持简单:除非绝对必要,否则尽量不要使用太多参数使脚本过载。
  5. 构建命令:对于复杂的工具,使用子解析器逻辑地分隔不同的命令。

结论

argparse 模块对于编写专业的、用户友好的 Python 脚本至关重要。通过利用其位置和可选参数、类型检查和子解析器等功能,您可以创建直观且强大的命令行界面。

下次构建 Python 脚本时,请考虑使用 argparse 使其更加灵活和易于访问。快乐编码!


如果您有疑问或建议,请随时与我联系。与我联系:

  • 领英
  • GitHub
版本声明 本文转载于:https://dev.to/usooldatascience/mastering-pythons-argparse-a-comprehensive-guide-for-beginners-48fn?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-07-03
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-07-03
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-07-03
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-07-03
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-07-03
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-03
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-03
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-07-03
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-03
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-07-03
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确...
    编程 发布于2025-07-03
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-07-03
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-03
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-07-03
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3