cmd– 支持面向行的命令解释器

源代码: Lib / cmd.py


Cmd类为写行提供了一个简单的框架 -面向命令的口译员。这些通常对测试工具,管理工具和原型有用,后来将用更复杂的界面包装.

class cmd.Cmd (completekey=”tab”, stdin=None, stdout=None

一个Cmd实例或子类实例是面向行的解释框架。没有充分的理由来实例化Cmd本身;相反,它作为你自己定义的解释器类的超类很有用,可以继承Cmd的方法并封装动作方法.

可选参数completekeyreadline完成键的名称;它默认为 Tab 。如果completekey不是None并且readline可用,则命令完成自动完成.

可选参数stdinstdout指定Cmd实例或子类实例将用于输入和输出的输入和输出文件对象。如果没有指定,它们将默认为sys.stdinsys.stdout.

如果你想使用给定的stdin,请确保将实例的use_rawinput属性设置为False,否则stdin将被签名

对象

一个Cmd实例有以下方法:

Cmd.cmdloopintro=None

反复发出提示,接受输入,解析接收输入的初始前缀,并调度到动作方法,将其余部分作为参数传递给

//可选参数是在第一个提示之前发出的标题或简介字符串(这会覆盖intro类属性).

如果加载了readline模块,输入将自动继承 bash – 就像历史列表编辑一样(例如 Control-P 滚动到最后一个命令,Control-N 前进到下一个, Control-F 非破坏性地向右移动光标,控制-B 将光标向左移动非破坏性等).

输入的文件结尾作为字符串"EOF".

解释器实例将识别命令名称foo当且仅当它有一个方法do_foo()。作为一种特殊情况,以字符"?"开头的行被调度到方法do_help()。作为一个特殊情况,一行以字符"!"被调度到方法do_shell()(如果定义了这样的方法).

postcmd()方法返回一个真值时,该方法将返回.stoppostcmd()是命令对应的返回值do_*()方法

如果启用完成,则自动完成命令,并通过调用complete_foo()witharguments text, line, begidxendidx. text是我们尝试匹配的字符串前缀:所有返回的匹配必须以它开头。line是删除前导空格的当前输入行,begidxendidx是前缀文本的开始和结束索引,可以根据参数的位置来提供不同的完成.

Cmd的所有子类都继承了预定义的do_help()。这个用参数"bar"调用的方法调用相应的方法help_bar(),如果不存在,则输出do_bar()的文档字符串,如果可用的话。没有参数,do_help()列出了可用的帮助主题(即所有带有相应的help_*()方法的命令或带有文档字符串的命令),还列出了任何未记录的命令.

Cmd.onecmdstr

解释这个论点,好像它是为响应提示而输入的。这可能会被覆盖,但通常不应该被覆盖;查看有用的执行挂钩的precmd()postcmd()方法。其中的值是一个标志,指示解释器对命令的解释是否应该停止。如果do_*()命令方法str,返回该方法的返回值,否则返回default()方法的返回值.

Cmd.emptyline ()

当空的时候调用方法输入行以响应提示。如果没有覆盖这个方法,它会重复输入的最后一个非空命令.

Cmd.defaultline)

当无法识别命令前缀时,方法调用输入行。如果没有覆盖这个方法,它会打印一条错误信息并返回.

Cmd.completedefault (text, line, begidx, endidx

当没有特定于命令时,方法调用完成输入行complete_*()方法可用默认情况下,它返回一个空列表.

Cmd.precmd(line)

在命令行line被解释之前执行的钩子方法,但在输入提示之后生成并发布。这个方法是Cmd中的存根;它存在被子类覆盖。返回值用作onecmd()方法执行的命令;precmd()实现可以重写命令或只是返回lineunchanged.

Cmd.postcmd (stop, line)

在命令调度完成后执行Hook方法。这个方法是Cmd中的存根;它存在被子类覆盖。line是执行的命令行,stop是一个标志,表示在调用postcmd()后将终止执行;这将是onecmd()方法的价值。此方法的返回值将用作内部标志的新值,对应于stop;返回false将导致解释继续.

Cmd.preloop ( )

调用cmdloop()时执行一次钩子方法。这个方法是一个存在Cmd;它存在被子类覆盖.

Cmd.postloop)

cmdloop()即将返回时,执行一次方法。这个方法是Cmd中的存根;它存在被子类覆盖.

Cmd子类的实例有一些公共实例变量:

Cmd.prompt

发出请求输入的提示

Cmd.identchars

字符串接受命令前缀的字符.

Cmd.lastcmd

看到的最后一个非空命令前缀

Cmd.cmdqueue

排队输入行列表。当需要新输入时,在cmdloop()中检查cmdqueue列表;如果它是非空的,它的元素将按顺序处理,就像在提示符下输入一样

Cmd.intro

一个字符串作为介绍或横幅发出。可以通过给cmdloop()方法一个参数来覆盖.

Cmd.doc_header

如果帮助输出有一个用于记录命令的部分,则发出标题.

Cmd.misc_header

如果有帮助则发出标题输出有一个用于杂项helptopics的部分(也就是说,help_*()方法没有相应的do_*()方法).

Cmd.undoc_header

如果帮助输出有一个未记录的部分,则发出标题命令(即do_*()方法没有相应的help_*()methods).

Cmd.ruler

用于在帮助消息头下绘制分隔线的字符。Ifempty,没有标尺线。它默认为"=".

Cmd.use_rawinput

一个标志,默认为true。如果为true,cmdloop()使用input() todisplay提示并读取下一个命令;如果不对,sys.stdout.write()sys.stdin.readline()使用。(这意味着通过导入readline,在支持它的系统上,解释器将自动支持 Emacs – 如行编辑和命令历史击键。)

Cmd示例

cmd模块主要用于构建自定义shell,让用户以交互方式处理程序.

本节介绍如何使用的简单示例围绕turtle模块中的一些命令构建一个shell

// forward()等基本龟命令被添加到Cmd子类中,方法名为do_forward()。该参数被转换为一个数字并被分派到海龟模块。文档字符串在shell提供的帮助实用程序中使用.

示例还包括用precmd()方法实现的基本记录和回放工具,该方法负责转换输入tolowercase并将命令写入一份文件。do_playback()方法读取文件并将录制的命令添加到cmdqueue forimmediate播放:

import cmd, sysfrom turtle import *class TurtleShell(cmd.Cmd):    intro = "Welcome to the turtle shell.   Type help or ? to list commands.\n"    prompt = "(turtle) "    file = None    # ----- basic turtle commands -----    def do_forward(self, arg):        "Move the turtle forward by the specified distance:  FORWARD 10"        forward(*parse(arg))    def do_right(self, arg):        "Turn turtle right by given number of degrees:  RIGHT 20"        right(*parse(arg))    def do_left(self, arg):        "Turn turtle left by given number of degrees:  LEFT 90"        left(*parse(arg))    def do_goto(self, arg):        "Move turtle to an absolute position with changing orientation.  GOTO 100 200"        goto(*parse(arg))    def do_home(self, arg):        "Return turtle to the home position:  HOME"        home()    def do_circle(self, arg):        "Draw circle with given radius an options extent and steps:  CIRCLE 50"        circle(*parse(arg))    def do_position(self, arg):        "Print the current turtle position:  POSITION"        print("Current position is %d %d\n" % position())    def do_heading(self, arg):        "Print the current turtle heading in degrees:  HEADING"        print("Current heading is %d\n" % (heading(),))    def do_color(self, arg):        "Set the color:  COLOR BLUE"        color(arg.lower())    def do_undo(self, arg):        "Undo (repeatedly) the last turtle action(s):  UNDO"    def do_reset(self, arg):        "Clear the screen and return turtle to center:  RESET"        reset()    def do_bye(self, arg):        "Stop recording, close the turtle window, and exit:  BYE"        print("Thank you for using Turtle")        self.close()        bye()        return True    # ----- record and playback -----    def do_record(self, arg):        "Save future commands to filename:  RECORD rose.cmd"        self.file = open(arg, "w")    def do_playback(self, arg):        "Playback commands from a file:  PLAYBACK rose.cmd"        self.close()        with open(arg) as f:            self.cmdqueue.extend(f.read().splitlines())    def precmd(self, line):        line = line.lower()        if self.file and "playback" not in line:            print(line, file=self.file)        return line    def close(self):        if self.file:            self.file.close()            self.file = Nonedef parse(arg):    "Convert a series of zero or more numbers to an argument tuple"    return tuple(map(int, arg.split()))if __name__ == "__main__":    TurtleShell().cmdloop()

这是一个示例会话,其中龟壳显示帮助功能,使用空白行重复命令,以及简单的记录和回放功能:

Welcome to the turtle shell.   Type help or ? to list commands.(turtle) ?Documented commands (type help <topic>):========================================bye     color    goto     home  playback  record  rightcircle  forward  heading  left  position  reset   undo(turtle) help forwardMove the turtle forward by the specified distance:  FORWARD 10(turtle) record spiral.cmd(turtle) positionCurrent position is 0 0(turtle) headingCurrent heading is 0(turtle) reset(turtle) circle 20(turtle) right 30(turtle) circle 40(turtle) right 30(turtle) circle 60(turtle) right 30(turtle) circle 80(turtle) right 30(turtle) circle 100(turtle) right 30(turtle) circle 120(turtle) right 30(turtle) circle 120(turtle) headingCurrent heading is 180(turtle) forward 100(turtle)(turtle) right 90(turtle) forward 100(turtle)(turtle) right 90(turtle) forward 400(turtle) right 90(turtle) forward 500(turtle) right 90(turtle) forward 400(turtle) right 90(turtle) forward 300(turtle) playback spiral.cmdCurrent position is 0 0Current heading is 0Current heading is 180(turtle) byeThank you for using Turtle

评论被关闭。