當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python Cmdparse用法及代碼示例

為編寫麵向行的命令解釋器提供簡單框架的類稱為 cmd 類。這些通常對於稍後將被包裝在更複雜的接口中的管理工具、原型和測試工具很有用。使用 cmd 模塊可以輕鬆創建命令行接口。
如今,圖形用戶接口的使用如此之多,以至於命令行解釋器似乎已經過時了。命令行接口有幾個優點:

  • 命令行接口是可移植的並且可以在任何地方運行。
  • CPU和內存資源比GUI接口便宜得多。
  • 使用命令行打開文件比進入驅動程序並搜索菜單更容易。
  • 創建麵向文本的文檔要快得多。

命令類

該模塊隻定義了一個類:Cmd 類。命令行解釋器創建sub-classing cmd.Cmd 類。 Cmd 實例或子類實例可以被視為麵向行的解釋器框架。

  • 創建命令:在解釋器提示符下輸入的一行文本的第一部分是命令。 identchars 成員中包含的最長字符串是 Command。
    非重音字母、數字和下劃線符號是默認的 identchars。該行的末尾是命令的參數。
  • 參數:do_xxx 方法隻應采用一個額外參數,該參數對應於用戶在命令名稱後輸入的字符串部分。
  • Errors:解釋器使用以下格式來表示錯誤:
*** : 
  • 返回值:在最常見的情況下:命令不應返回值。當您想要退出解釋器循環時,任何返回真值的命令都會停止解釋器,這是一個例外。
    Example:

Python3


def add(self, d):
    k = d.split()
    if len(k)!= 2:
       print "*** invalid number of arguments"
       return
    try:
       k = [int(i) for i in k]
    except ValueError:
       print "*** arguments should be numbers"
       return
    print k[0]+k[1]

命令解析模塊

cmdparser 包包含兩個可用於編寫文本命令解析器的模塊。
該模塊特別使用內置的Python cmd 模塊。該軟件包由兩個模塊組成:

  • cmdparser.cmdparser
  • cmdparser.datetimeparse

安裝

我們可以從 PyPI 安裝 cmdparse 包。例如

pip install cmdparse

cmdparse 概述

Cmd 模塊允許從文本命令規範創建解析樹,如下所示

chips( spam | ham [eggs] | beans [eggs [...]] )

可以使用這些解析樹檢查特定的命令字符串。此外,它還允許列出部分命令字符串的有效完成。
例子:

Python3


from cmdparser import cmdparser
parse_tree = cmdparser.parse_spec("abc (def|ghi) <jkl> [mno]")
# Returns None to indicate
# successful parse
parse_tree.check_match(("abc", "def", "anything"))
# Returns an appropriate 
# parsing error message
parse_tree.check_match(("abc", "ghi", "anything", "pqr"))
# Returns the list ["def", "ghi"]
parse_tree.get_completions(("abc", ))

輸出:

python-cmdparse-1

可以設置動態令牌,其中接受的字符串列表可以隨時間變化,或者在處理固定令牌字符串時可以接受任意字符串或字符串列表。檢查模塊的文檔字符串以了解可用類的具體信息,例如:

Python3


from cmdparser import cmdparser
class fruitToken(cmdparser.Token):
     
    def get_values(self, context):
        # Static list here, but could
        # easily be dynamic
        return ["raspberry", "orange", "mango",
                "grapes", "apple", "banana"]
def my_ident_factory(token):
     
    if token == "number":
        return cmdparser.IntegerToken(token)
     
    elif token == "fruit":
        return fruitToken(token)
     
    return None
parse_tree = cmdparser.parse_tree("take <number> <fruit> bags",
                                  ident_factory = my_ident_factory)
# Returns None to indicate successful
# parse, and the "cmd_fields" dict will
# be initialised as:
# { "take": ["take"], "<number>": ["23"],
#   "<fruit>": ["apple"], "bags": ["bags"] }
cmd_fields = {}
parse_tree.check_match(("take", "23",
                        "apple", "bags"), 
                       fields = cmd_fields)
# Returns an appropriate 
# parsing error message
parse_tree.check_match(("take", "all", 
                        "raspberry", "bags"))
# Returns the list ["raspberry",
# "orange", "mango", ..., "banana"]
parse_tree.get_completions(("take", "5"))

輸出:

python-cmdparser-2

有四個類可用,它們是用戶派生令牌的合適基類:

  • Token:當一組固定值合適時,這是有用的,其中列表可以是固定的或動態的。應重寫 get_values() 方法以將有效標記列表作為字符串返回。
  • Anytoken:它與 Token 類似,但可以是任何字符串。可以通過 validate() 方法執行驗證,但 validate() 方法不允許製表符完成,因為隻有在解析整個命令後才會調用它。如果需要的話,還有一個convert()方法
  • AnyTokenString:與 AnyToken 類似,但命令行上的所有剩餘項目都會被消耗。
  • Subtree:它匹配整個命令子樹,並將結果存儲在字段字典中的指定標記上。命令規範字符串應傳遞給構造函數,類型類將重寫 convert() 方法並以某種方式解釋命令(盡管這是嚴格可選的)。
    裝飾器可與從 cmd.Cmd 派生的命令處理程序一起使用,它允許從文檔字符串幫助文本中自動提取命令字符串,並允許將命令解析和完成添加到類的命令處理方法中。
    實現do_XXX() 形式的各種方法來實現 cmd.Cmd 類。

Python3


from cmdparser import cmdparser
@cmdparser.CmdClassDecorator()
class CommandHandler(cmd.Cmd):
    @cmdparser.CmdMethodDecorator():
    def do_command(self, args, fields):
        """command ( add | delete ) <name>
        The example explains the use of 
        command to demonstrate use of the cmd
        decorators.
        """
        # Method body - it will only be called 
        # if a command parses successfully according
        # to the specification above.

日期時間解析概述

  • Datetimeparse 模塊添加了特定的標記類型來解析人類可讀的日期和時間規範。指定絕對日期和相對日期這兩種類型,並根據需要將其轉換為其他實例。
    一些例子是
1:35 on friday last week
11 feb 2019
  • 當前定義的類有:
    • DateSubtree:它包括文字日期 (2020-03-14)、與當天相關的星期幾(上周星期六)、說明性版本(2019 年 6 月 26 日)以及昨天、今天和明天以及解析日曆日期。返回值是datetime.date實例。
    • TimeSubtree:12 或 24 小時格式的時間由 TimeSubtree 解析。返回值是time.localtime()返回的值。
    • RelativeTimeSubtree:返回的值是 cmdparser.DateDelta 的實例,它是包含 datetime.timedelta 的包裝類。它解析指示與當前時間的時間偏移的短語,例如 3 天前和 2 小時前。
    • DateTimeSubtree:datetime.datetime 實例是返回值。DateTimeSubtree 解析日期和時間的規範,接受 DateSubtree 和 TimeSubtree 短語的組合,或 RelativeTimeSubtree 短語;在後一種情況下,時間是相對於當前時間而言的。
    • CLassCalenderPeriodSubtree:解析過去日曆周期的規範。返回的值是 datetime.date 實例的 2 元組,表示指定的日期範圍,其中第一個日期包含在內,第二個日期不包含在內。


相關用法


注:本文由純淨天空篩選整理自shivalibhadaniya大神的英文原創作品 Cmdparse module in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。