Python Cmdparser模块

Python Cmdparser模块

有时候,我们需要使用命令提示符终端来编写命令,这个终端将解释为各种目的编写的内联命令,被称为命令解释器。我们可以编写和构建一个框架,用于编写面向行的命令解释器,并且为了完成这个任务,有时我们需要使用类。提供一个为命令解释器提供框架的类,以便我们可以编写面向行的命令,这个类被称为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模块:

pip install cmdparser

在上面给出的命令后,我们需要按下回车键并等待一段时间,因为安装这个模块会需要一些时间来成功完成。

Python Cmdparser模块

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

Cmdparser模块:cmdparser子模块概述:

Python的Cmdparser包的cmdparser子模块允许我们使用文本命令规范创建解析树结构,例如下面的规范:

fries( scam | ham [eggs] | peas [omelette [...]] )

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

示例: 看下面的Python程序,我们从cmdparser子模块创建了一个解析树,然后将标记与解析树进行匹配:

# Import cmdparser package from cmdparser module
from cmdparser import cmdparser
# Creating a sample parse tree
parseTree = cmdparser.parse_spec("abcd (efgh|ijkl)  [qrst]")
# Matching tokens from parse tree
parseTree.check_match(("abcd", "efgh", "something"))
parseTree.check_match(("abcd", "efgh", "anything", "uvwx")) # Will throw an error 
# Completing parse tree in the output
parseTree.get_completions(("abcd", ))

输出:

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

Python Cmdparser模块

解释:

首先,我们从cmdparser包中导入cmdparser子模块,以创建一个包含程序中标记的解析树。然后,我们使用cmdparser包中的parse_spec()函数创建了一个样本解析树,将其存储在parseTree变量中。在解析树中,我们只定义了静态标记,并在后面用于匹配。然后,我们使用cmdparser包的parse_match()函数来匹配我们定义的解析树中的标记。在第二次匹配中,由于”uvwx”不是包中定义的静态标记,解析树将抛出错误。最后,我们使用parse_completions()函数来完成解析树中剩余的标记。此函数会将解析树的剩余静态标记打印出来。

现在,从输出可以看到,解析树中剩余的静态标记已经打印出来,在此之前,还打印出了”uvwx”标记的错误。

我们在解析过程中使用了静态标记,这些标记是我们在上面的示例中创建的。但是,我们也可以使用Cmdparser模块中的动态标记来创建解析树。当我们创建一个带有动态标记的解析树时,我们可以设置动态标记,其中接受字符串列表,并且这些字符串列表在时间上是可变的。当我们处理固定标记字符串时,我们也可以使用动态标记来接受任意字符串或字符串列表。如果我们想查看Cmdparser模块中所有可用类的规格说明以设置动态标记,我们可以查看模块的文档字符串。在这里,我们将通过使用Cmdparser模块类创建带有动态标记的解析树的示例来理解这一点。请看下面的示例,我们使用Cmdparser模块的动态标记创建了一个解析树。

示例2: 请看下面的Python程序,我们使用动态标记创建了一个解析树,以接受一个动态字符串列表:

# Import cmdparser from Cmdparser module
from cmdparser import cmdparser
# Class having fruit names as token
class tokenOfFruit(Cmdparser.Token):
    def get_values(self, context):
        return ["watermelon", "melon", "orange", "grapes", "lichi", "mango", "apple", "banana", "strawberry", "guava", "greenapple"] # Tokens of class with fruit name values
# Default function for identification
def myIdentfictionFactory(token):
    if token == "number":
        return Cmdparser.IntegerToken(token) # If token is a number
    elif token == "fruit":
        return tokenOfFruit(token) # If token is a fruit name
    return None
# Creating a parse tree with fruit and number token in it
parseTree = Cmdparser.parse_spec("keep   packet", ident_factory = myIdentfictionFactory)
cmdFields = {}
# Matching with the parse tree
parseTree.check_match(("keep", "26", "mango", "packet"), fields = cmdFields)
parseTree.check_match(("keep", "all", "orange", "packet"))
# Getting completions from the parse tree
parseTree.get_completions(("keep", "24",))

输出:

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

Python Cmdparser模块

解释:

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

cmdparser子模块中的类

以下是cmdparser子包中适用于创建用户派生标记(静态和动态)的基类的四个类:

  • Token(标记): Token是来自cmdparser子包的基类,它在我们创建的解析树中适用于固定值集合的一部分。在解析树中,列表的字符串值可以是静态的或动态的,这个类可以用来创建和接受标记。如果我们希望从解析树中作为字符串列表返回一个有效标记列表,我们必须重写get_values()方法。
  • AnyToken(任意标记): 这个基类类似于子包中的Token类,但在使用AnyToken基类时,预期的结果是任意字符串。如果我们希望对标记进行验证,我们可以通过子模块中可用的validate()方法来实现。但是,在使用validate()方法之前,我们应该注意validate()方法不允许使用Tab键补全,因为它仅在整个命令解析时调用。在调用字符串列表(静态和动态)时,AnyToken基类还需要convert()方法。
  • AnyTokenString(任意字符串标记): AnyTokenString基类在功能上与AnyToken类非常相似。但是,在AnyTokenString类中,解析期间会消耗掉我们在命令行上定义的所有剩余项。
  • Subtree(子树): cmdparser子包中的子树基类与我们创建的解析树中的整个命令进行匹配,并将匹配过程的结果存储在字典字段中指定的标记中。在使用子树类时,我们必须将命令规范字符串传递给类的构造函数,然后类型类将覆盖convert()方法来解释命令。

Cmdparser模块:datetimeparser子模块概述

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

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

  • 02 November 2020
  • 01: 28 on Thursday last week等等。

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和datetimeparser子模块,以及它们在创建解析树的标记时如何有帮助。最后,我们查看了Cmdparser包的两个子模块的基类,并学习了这些类如何在解析给定解析树标记的规范时有帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程