」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握 Python 的 argparse:初學者綜合指南

掌握 Python 的 argparse:初學者綜合指南

發佈於2024-11-08
瀏覽:539

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錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,以便更快地搜索這些前綴。 理解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-07-03
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-07-03
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-07-03
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-03
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-03
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-07-03
  • 切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    程式設計 發佈於2025-07-03
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-07-03
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-07-03
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-07-03
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    程式設計 發佈於2025-07-02
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-07-02
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。 This article delves into the differences betwee...
    程式設計 發佈於2025-07-02
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-07-02
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-07-02

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3