Argparse vs Docopt vs Click - Python 命令行解析库比较

2024年8月29日 | 阅读 7 分钟

在本教程中,我们将根据各种方面比较 Python 的 Argparse、Docopt 和 Click 解析库。

Argparse

从 Python 2.7(及更高版本)开始,argparse Python 模块是标准库的一部分,可以更轻松地解析命令行参数。它提供了一种快速有效的方法来为 Python 程序生成用户友好的命令行界面。

argparse 模块负责解析脚本执行时用户提供的命令行参数。这允许作者指定他们的脚本应该接受的参数。

argparse 的关键特性包括

  • 参数解析:构建脚本期望的命令行参数(如位置参数和可选参数)的能力称为参数解析。
  • 参数类型:argparse 支持多种参数类型,包括字符串、整数、浮点数、文件等。此外,还可以提供自定义参数类型。
  • 帮助生成:用户可以轻松理解如何与脚本进行交互,因为 argparse 会根据提供的参数自动生成帮助消息。
  • 默认值:如果用户未指定默认值,参数可能具有默认值。
  • 互斥参数:不能同时使用的参数称为互斥参数,这是参数的定义。

使用 argparse 的典型过程如下

  • 导入 argparse 模块。
  • 创建一个 ArgumentParser 对象
  • 使用 add_argument() 指定脚本应接受的参数。
  • 使用 parse_args() 解析命令行参数。

这是一个简单的例子

输出

$ python script_name.py John --person_age 30
Hello, John! You are 30 years old.

$ python script_name.py Alice
Hello, Alice! You are 25 years old. (default value)

脚本期望一个位置参数 name(你的名字)和一个可选参数 -age,用于指定你的年龄。你可以使用 python script.py 来运行脚本。John,30 岁,输出将是“你好!”你的年龄是三十。

由于其功能、灵活性以及包含在标准库中,这使其在所有 Python 安装中都可用,argparse 经常用于为 Python 应用程序构建命令行界面。

Docopt

Python 的 Docopt 模块根据程序文档字符串(docstring)中概述的使用模式解析命令行参数。由于它允许开发人员直接在 docstring 中指定命令行界面,因此文档和界面描述紧密相连。它以其简洁性和可用性而闻名。

Docopt 的基本原理是利用 docstring 来定义命令行参数的结构。然后 docopt 会根据该规范自动解析提供的命令行参数。这种方法将所有内容保留在一个地方,并消除了单独声明参数的需要,这对于较小的命令行界面很有用。

Docopt 的显著属性包括以下内容

  • 自然语言语法:命令行界面的编写方式既易于人类阅读,又易于维护。
  • 自动参数解析:使用指定的 docstring,该库会自动构建参数解析器,无需显式声明参数。
  • Docopt 可以自动生成帮助消息,这些消息提供关于如何使用脚本的准确说明,基于 docstring。
  • 单命令界面:与 argparse 和 click 不同,Docopt 专注于具有明显使用模式的单命令脚本,而 argparse 和 click 则允许创建多命令界面。

必须遵循以下步骤才能使用 docopt

  • 在脚本的 docstring 中定义命令行界面和使用模式。
  • 调用 docopt,同时传递用户提供的命令行参数和 docstring。
  • 通过访问解析的参数在脚本中使用它们。

这是一个简单的例子

Python 脚本可以使用此 script.py Greeting John 运行来获得结果 Greetings, John!或者,使用 Python script.py count 函数来获取

输出

1
2
3
4
5

Docopt 是一个用于可访问命令行界面的强大选项,特别是对于用途较少且简单的脚本。然而,像 argparse 和 click 这样的库为具有复杂多命令情况的界面提供了更复杂的功能和灵活性。

Click

Click Python 模块为 Python 应用程序开发命令行界面(CLI)提供了一种快速有效的方法。其用户友好、直观且功能丰富的架构使开发人员能够轻松创建复杂的、交互式的命令行应用程序,而只需很少的样板代码。

  • 简洁性:Click 以其简单的 API 而闻名,使开发人员能够轻松地构建 CLI,代码量很少。
  • 装饰器:为了指定命令、选项和参数,Click 使用 Python 装饰器。这有助于保持代码的组织性和可读性。
  • 命令组:它支持命令组,这使得创建分层命令和子命令成为可能,从而为广泛的命令行界面提供了更有条理的结构。
  • 参数类型:Click 提供了各种内置参数类型,包括字符串、整数、浮点数和路径。Click 还使开发人员能够轻松构建自定义参数类型。
  • 上下文传递:函数直接获取 CLI 上下文,从而可以轻松访问命令之间的共享数据。
  • 自动帮助生成:根据提供的命令和选项,Click 会自动生成帮助消息和使用信息,从而
  • 提示:它提供了在命令执行时向用户请求输入的选项。
  • Shell 补全:Click 通过支持 bash、zsh 和 fish 的 shell 补全,使 CLI 更易于用户使用。

您通常需要执行以下步骤来使用 Click

  • 导入点击模块。
  • 使用装饰器来指定命令、选项和参数。
  • 创建 click.Command 对象,并为命令和子命令分组。
  • 实现用于执行命令的过程。

输出

$ python script.py --name Alice --age 28

Hello, Alice! You are 28 years old.

这些都有独特的好处和应用。让我们从几个方面进行比较

易用性

  • argparse:与其他两个库相比,它提供了更复杂的 API。它需要精确定义参数类型、帮助消息和其他特性。
  • Docopt:它提供 docstrings 作为构建命令行界面的简单而优雅的方式。由于代码和文档紧密集成,因此易于理解和维护。
  • Click:它以其简单的设计而闻名。可以轻松编写命令行界面,只需很少的样板代码。

特点

  • argparse:它具有子解析器、参数组、类型检查、默认值以及其他高级功能。argparse 包含许多高级功能。
  • docopt:虽然不如 argparse 复杂,但 docopt 满足了命令行参数处理的基本要求。它仅提供 argparse 和 click 所提供的一些复杂功能。
  • Click:它提供了多种功能,包括参数类型、参数解析、子命令、自定义帮助消息等。其主要目标是增强用户体验。

学习曲线

  • argparse:argparse 的学习曲线通常较长,特别是对于复杂的命令行界面。
  • Docopt:由于它使用自然语言来定义命令行界面,因此它是最容易学习和使用的。
  • Click:它在功能和简洁性之间取得了坚实的平衡,易于学习,同时仍然提供强大的功能。

文档

  • argparse:由于它是 Python 标准库的一部分,它拥有丰富而权威的文档。
  • docopt:docopt 通常使用 docstrings 来定义界面,其文档清晰简洁。
  • Click:它提供了出色的文档,可以轻松找到解决方案并理解其各种功能。

社区和维护

  • argparse:作为 Python 标准库的一部分,argparse 维护良好,拥有庞大的用户群。
  • Docopt:尽管得到了广泛使用,但与 argparse 和 click 相比,它最近的改进较少。
  • Click:活跃的维护和蓬勃发展的社区提供了持续的支持和问题修复。

采用和受欢迎程度

  • argparse:由于它包含在 Python 标准库中,并且在所有 Python 安装中都可用,因此 argparse 被广泛使用。
  • docopt:它已被广泛使用,尽管其普及程度随时间略有下降。
  • Click:由于其全面的功能集和易用性,它正迅速普及。

结论

最适合您的库将取决于您的具体需求和偏好。如果您需要复杂的功能和灵活性,argparse 是一个不错的选择。Docopt 可能是快速原型设计和基本界面的合适选择。但是,如果您想要一个用户友好、灵活且具有现代风格的库,click 是最佳选择。在选择时,请考虑命令行界面的复杂性以及您愿意接受的学习曲线。