Python Cmdparser 模块

2025年3月17日 | 阅读11分钟

有时,我们必须使用命令提示符终端编写命令,而这个终端用于解释为各种目的编写的内联命令,被称为命令解释器。我们可以编写和构建一个框架,用于编写面向行的命令解释器,为了实现这个任务,有时我们必须使用类。一个为命令解释器提供框架的类,以便我们可以编写面向行的命令,称为 cmd 类。现在,许多人想知道 cmd 类的用途以及它对我们有何帮助。cmd 类对于创建原型、稍后将包装的测试工具以及以更复杂方式呈现的管理工具非常有用。因此,要执行所有这些任务并创建这些工具,我们必须使用命令行界面,这可以使用 cmd 类轻松构建。

命令行解释器的使用已经变得非常罕见,因为现在大多数应用程序中图形用户界面 (GUI) 已经增加。因此,用户更倾向于使用这些应用程序,而不是使用简单的面向行的命令解释器,但使用命令行界面有其自身的优点。

以下是使用命令行界面或解释器的几个优点:

  • 这些命令行解释器没有基于 GUI 的界面;因此,计算资源更便宜的计算机的 CPU 和内存资源也可用。
  • 使用命令行解释器创建面向文本的文档非常容易,而且我们可以非常快速地创建它。
  • 由于命令行解释器是可移植的,因此我们可以在任何设备上运行它们。
  • 在命令行解释器中打开文件非常容易,这种方法比进入驱动器并在菜单中搜索文件要快得多。

这些是命令行解释器的一些主要优点,这就是为什么即使在今天,大多数用户仍然倾向于它们,而不是许多界面更具吸引力的基于 GUI 的应用程序。在看到这些优点之后,我们可以理解并得出结论,使用 cmd 类构建命令行解释器是多么有用。它不仅对我们的职业生涯和专业任务有帮助,而且对我们的个人项目也有帮助。许多人会惊讶地听到 cmd 类也存在于 Python 包中,因此可以使用 Python 程序创建命令行界面的框架。我们将在 Python 中学习 Cmdparser 模块,其中我们将看到 cmd 类的使用,我们将使用此模块构建命令行解释器的框架。

Python 中的 Cmdparser 模块

Cmdparser 模块是一个 Python 包,其中包含两个子模块,它们对于我们编写文本命令解析器和创建命令行界面框架非常有用。Cmdparser 模块还使用其中的 cmd 类和函数,我们将在程序中使用这些函数来构建解析树以执行名称匹配操作。Python 中的 Cmdparser 模块使用 Python 的内置 cmd 模块并调用它来创建命令行界面的框架。

Python 的 Cmdparser 模块包含以下两个子模块或 Python 包:

  • datetimeparse
  • cmdparser

在本教程中,我们将学习 Cmdparser 包的两个子模块的实现和工作原理,并在 Python 程序中使用它们来创建一个简单的解析树。

Cmdparser 模块:安装

如果要在 Python 程序中使用 Cmdparser 模块的函数和子模块,我们应该确保此模块存在于我们的系统中,因为它不是 Python 的内置模块。因此,如果 Cmdparser 模块尚未存在于我们的系统中,我们必须安装它才能进一步实现其子模块。我们可以通过各种安装过程安装 Cmdparser 模块,但在这里我们将使用 pip 安装程序来执行此任务,因为它是最简单直接的方法。

在终端 shell 中输入以下命令,通过 pip 安装程序在我们的系统中安装 Cmdparser 模块:

输入上述命令后,我们必须按回车键并等待一段时间,因为它需要一些时间才能成功安装此模块。

Python Cmdparser Module

如我们所见,Cmdparser 模块现在已成功安装在我们的系统中,现在我们可以通过将其导入程序来使用它及其子模块。我们将首先了解 Cmdparser 包的 cmdparser 子模块的概述和实现,然后我们将了解 datetimeparser 子模块的概述。

Cmdparser 模块:cmdparser 子模块概述

Python 的 Cmdparser 包中的 cmdparser 子模块允许我们借助文本命令规范(如下所示)创建解析树结构:

我们可以使用解析树结构检查此特定命令字符串。cmdparser 子模块还允许我们验证部分命令字符串的完成情况,以便将其列入解析树。让我们通过使用上面列出的文本命令规范,从 Python 程序中创建解析树来理解这个概念。

示例:请看下面的 Python 程序,其中我们从 cmdparser 子模块创建了一个解析树,然后将令牌与解析树匹配。

输出

"command invalid somewhere in: 'uvwx'"
{'efgh', 'ijkl'}

Python Cmdparser Module

说明

我们首先从 cmdparser 包导入 cmdparser 子模块,以便在程序中创建带有令牌的解析树。之后,我们使用 cmdparser 包的 parse_spec() 函数在 parseTree 变量中创建了一个示例解析树。在解析树中,我们只定义了静态令牌,并在之后用于匹配。之后,我们使用 cmdparser 包的 parse_match() 来匹配我们定义的解析树中的令牌。在第二次匹配中,解析树将抛出错误,因为 "uvwx" 不是包中定义的静态令牌。最后,我们使用 parse_completions() 函数完成解析树中剩余的令牌。此函数将在输出中打印解析树中剩余的静态令牌。

现在,正如我们可以在输出中看到的,解析中剩余的静态令牌被打印出来,在此之前,也打印了 "uvwx" 令牌的错误。

我们在上面给出的示例中创建的解析中使用了静态令牌,但我们也可以借助 Cmdparser 模块使用动态令牌创建解析树。在创建包含动态令牌的解析树时,我们可以设置接受字符串列表的动态令牌,并且动态令牌中的字符串列表会随着时间的推移而改变。在处理固定令牌字符串时,我们还可以使用接受任意字符串或字符串列表的动态令牌。如果我们要查看 Cmdparser 模块中所有可用于设置动态令牌的类的规范,我们可以查看模块的 docstrings。在这里,我们将通过使用 Cmdparser 模块类创建带有动态令牌的解析树来理解这一点。请看下面的示例,其中我们使用 Cmdparser 模块中的动态令牌创建了一个解析树。

示例 2:请看下面的 Python 程序,其中我们创建了一个带有动态令牌的解析树,以接受动态字符串列表。

输出

"'all' is not a valid "
{'apple',
 'banana',
 'grapes',
 'greenapple',
 'guava',
 'lichi',
 'mango',
 'melon',
 'orange',
 'strawberry',
 'watermelon'}

Python Cmdparser Module

说明

从 Cmdparser 模块导入 cmdparser 子模块包后,我们在程序中创建了一个以水果名称作为解析树令牌的类。我们在 'tokenOfFruits' 类中定义的水果名称将作为解析树的静态令牌,并且为了从类中检索水果名称的值,我们在类中定义了一个默认函数。然后,我们定义了另一个函数(myIdentificationFactory),它将在解析树中接受动态令牌,并且它将接受数字值(数字)作为匹配值。为了设置带有数字值的动态令牌,我们使用了 Cmdparser 包中的 IntegerToken() 函数,因此它将使其成为一个动态令牌,它将接受任何整数值作为解析树中的匹配值。之后,我们使用 parse_spec() 函数创建了解析树,其中包含数字和水果作为动态令牌,"keep" 和 "packet" 作为静态令牌。然后,我们使用 check_match() 函数并在其中给出令牌值,以执行解析树中的匹配操作。我们可以在输出中看到,当我们没有提供数字时,它将抛出匹配错误。最后,当我们使用 get_completions() 函数与解析树时,所有用作令牌的水果值都会打印在输出中。

cmdparser 子模块中的类

以下是 cmdparser 子包中可用的四个类,它们适合作为基类来创建用户派生令牌(静态和动态):

  • Token:Token 是 cmdparser 子包中的基类,当我们在创建的解析树中适用一组固定值之一时,它非常有用。在解析树中,字符串值的列表可以是静态的或动态的,此类别可用于创建和接受令牌。如果我们要从解析树中返回有效令牌列表作为字符串列表,我们必须重写 get_values() 方法。
  • AnyToken:此基类与子包的 Token 类相似,但在使用 AnyToken 基类时,结果中预期会有任何字符串。如果我们要执行令牌的验证,可以通过子模块中提供的 validate() 方法来完成。但是,在使用 validate() 方法之前,我们应该注意 validate() 方法不允许制表符补全,因为它只在整个命令被解析时才被调用。AnyToken 基类在调用字符串列表(静态和动态)时也需要 convert() 方法。
  • AnyTokenString:AnyTokenString 基类在两个基类执行的功能方面与 AnyToken 类非常相似。但是,在 AnyTokenString 类中,在解析过程中,命令行上定义的剩余项都将被消耗。
  • Subtree:cmdparser 子包中的 subtree 基类匹配我们创建的解析树中的整个命令,并将匹配过程的结果存储在字典字段中指定的令牌中。在使用 subtree 类时,我们必须将命令规范字符串传递给类的构造函数,然后类型类将重写 convert() 方法来解释命令。

Cmdparser 模块:datetimeparser 子模块概述

Cmdparser 包中的 datetimeparser 子模块在解析树的创建中添加了一些特定的令牌类型,这将有助于解析与日期和时间格式相关的可读规范。在 datetimeparser 子模块中,指定了绝对和相对类型的日期,并且这些类型可以在需要时和适当时转换为其他实例。

以下是 datetimeparser 子模块中日期类型的示例:

  • 2020 年 11 月 2 日
  • 上周四 01:28 等。

datetimeparser 子模块中的类

以下是 Cmdparser 模块的 datetimeparser 子包中可用的五个类,它们适合作为基类来创建用户派生令牌(静态和动态):

  • TimeSubtree:datetimeparser 子模块的 TimeSubtree 类用于解析解析树中以 12 或 24 小时格式给定的时间。解析给定时间后返回的值通过 time.localtime() 函数返回。
  • DateSubtree:datetimeparser 子模块中的 DateSubtree 类与 TimeSubtree 类类似。DateSubtree 类包含不同日期格式的字面量,即与当前日期相关的周中的日期(上周一)、字面日期(01-11-2021)、描述性日期版本(01-November-2021),以及今天、昨天和明天以及解析日历日期。DateSubtree 类返回的值是解析树中的 datetime.date 实例。
  • DateTimeSubtree:阅读完 datetimeparser 子模块的前两个基类的描述后,我们可以从其名称中获得 DateTimeSubtree 类的基本概念。DateTimeSubtree 类解析解析树中给定的日期和时间的规范。DateTimeSubtree 接受 TimeSubtree 和 DateSubtree 短语的组合或 RelativeTimeSubtree 类的短语(我们接下来将阅读此类的相关内容)来解析日期和时间的规范。如果短语来自 RelativeTimeSubtree 类,则时间将根据给定时间以相对格式获取。DateTimeSubtree 类返回的值是 datetime.datetime 实例值。
  • RelativeTimeSubtree:datetimeparser 子模块中的 RelativeTimeSubtree 基类从包装器类返回其返回值。RelativeTimeSubtree 类用于解析以表示与当前时间的偏移量(例如两天前、三小时前等)的短语。RelativeTimeSubtree 类返回的值是 cmdparser.DateDelta 类(datetimeparser 子模块中的一个包装器类)的一个实例,其中包含 datetime.timedelta 实例。
  • CLassCalenderPeriodSubtree:CLassCalenderPeriodSubtree 是 datetimeparser 子模块中的最后一个基类,它解析从过去给定的日历周期规范。此类返回的值是 datetime.date 实例的 2 元组,它以返回值格式表示以下内容:日历中指定的日期范围,其中范围中的第一个日期是包含的,范围中的第二个日期是排除的等。

结论

在本教程中,我们学习了 Cmdparser 模块,并了解了如何使用此模块的包创建 cmdparser 接口。我们了解了 Python 中 Cmdparser 包的 cmdparser 和 datetimeparser 子模块,以及它们如何有助于为解析树创建令牌。最后,我们查看了 Cmdparser 包的两个子模块的基类,并了解了这些类如何有助于解析为解析树令牌给定的规范。


下一主题Python Dash 模块