cmd
cmd - 支持面向行的命令解释器
源代码:
Lib / cmd.py
本Cmd
类为编写面向行的命令解释一个简单的框架。这些对于测试线束,管理工具和原型来说通常很有用,这些工具和原型稍后将被包装在更复杂的界面中。
class cmd.Cmd([completekey[, stdin[, stdout]]])
一个Cmd
实例或子类实例是一个面向行的解释器框架。没有充分的理由来实例化Cmd
自己; 相反,它作为您自己定义的解释器类的超类很有用,以继承Cmd
方法和封装操作方法。
可选参数completekey
是readline
完成键的名称; 它默认为Tab
。如果completekey
不None
和readline
是可用的,命令完成自动完成。
可选参数stdin
和stdout
指定了Cmd实例或子类实例将用于输入和输出的输入和输出文件对象。如果没有指定,他们将默认为sys.stdin
和sys.stdout
。
如果你想要使用一个给定的stdin
,确保将实例的use_rawinput
属性设置为False
,否则stdin
将被忽略。
在版本2.3中更改:添加了标准输入
和标准输出
参数。
1. Cmd对象
一个Cmd
实例有以下方法:
Cmd.cmdloop([intro])
反复发出提示,接受输入,从收到的输入中解析出一个初始前缀,并分派给操作方法,将其余的行作为参数传递给它们。
可选参数是在第一个提示之前发布的横幅或介绍字符串(这将覆盖intro
类属性)。
如果readline
模块被加载,输入将自动继承类似bash
的历史列表编辑(例如,Control-P
滚动回到最后一个命令,Control-N
转到下一个命令,以Control-F
非破坏性的方式向右Control-B
移动光标,破坏性地等)。
输入的文件结束被作为字符串传回'EOF'
。
一个解释器实例会识别一个命令名称,foo
当且仅当它有一个方法do_foo()
。作为一种特殊情况,以字符开头的行将'?'
被分派给该方法do_help()
。作为另一种特殊情况,以字符开头的行将'!'
被分派给方法do_shell()
(如果定义了这种方法)。
当postcmd()
方法返回一个真值时,这个方法会返回。该站
参数postcmd()
是命令的相应的返回值do_*()
的方法。
如果启用了完成,完成命令将自动完成,并通过调用complete_foo()
参数text
,line
,begidx
和endidx来
完成命令args 。text
是我们试图匹配的字符串前缀:所有返回的匹配都必须以它开头。行
是删除前导空白的当前输入行
,begidx
和endidx
是前缀文本的开始和结束索引,可用于根据参数位于哪个位置来提供不同的完成。
所有Cmd
继承预定义的子类do_help()
。此方法使用参数'bar'
调用,调用相应的方法help_bar()
,如果不存在,则打印文档字符串(do_bar()
如果可用)。如果没有参数,则do_help()
列出所有可用的帮助主题(即所有具有相应help_*()
方法或具有文档字符串的命令的命令),并列出所有未记录的命令。
Cmd.onecmd(str)
解释参数,就好像它是根据提示输入的一样。这可能会被忽略,但通常不需要; 请参阅precmd()
和postcmd()
有用的执行钩子的方法。返回值是一个标志,指示解释器是否应停止解释命令。如果str
do_*()
命令有一个方法,则返回该方法的返回值,否则返回该方法的返回值。default()
Cmd.emptyline()
在响应提示输入空行时调用的方法。如果此方法未被覆盖,则重复输入的最后一个非空命令。
Cmd.default(line)
在命令前缀未被识别时在输入行上调用的方法。如果这个方法没有被覆盖,它会输出一个错误信息并返回。
Cmd.completedefault(text, line, begidx, endidx)
当没有特定于命令的complete_*()
方法可用时,调用方法来完成输入行。默认情况下,它返回一个空列表。
Cmd.precmd(line)
钩方法执行
的命令行
之前行
解释,但会产生和发出的输入提示之后。这个方法是一个存根Cmd
; 它存在被子类覆盖。返回值用作将由方法执行
的命令onecmd(
该precmd()实现
可以重新写入命令或简单地返回线不变
。
Cmd.postcmd(stop, line)
Hook方法在命令调度完成后执行。这个方法是一个存根Cmd
; 它存在被子类覆盖。line
是执行的命令行,stop
是一个标志,表示在调用之后执行是否会终止postcmd(
这将是方法的返回值onecmd()。该
方法的返回值将被用作与停止对应
的内部标志的新值; 返回错误将导致解释继续。
Cmd.preloop()
钩子方法cmdloop()
被调用时执行一次。这个方法是一个存根Cmd
; 它存在被子类覆盖。
Cmd.postloop()
Hook方法在cmdloop()
即将返回时执行一次。这个方法是一个存根Cmd
; 它存在被子类覆盖。
Cmd
子类的实例具有一些公共实例变量:
Cmd.prompt
发出提示以请求输入。
Cmd.identchars
接受命令前缀的字符串。
Cmd.lastcmd
最后看到非空命令前缀。
Cmd.cmdqueue
排队的输入行列表。cmdloop()
当需要新输入时,会检查cmdqueue列表; 如果它不是空的,它的元素将按顺序处理,就像在提示符处输入一样。
Cmd.intro
作为介绍或横幅发布的字符串。可以通过给cmdloop()
方法一个参数来覆盖。
Cmd.doc_header
如果帮助输出包含用于记录的命令的部分,则发出头文件。
Cmd.misc_header
如果帮助输出具有用于其他帮助主题的部分(即,help_*()
没有相应do_*()
方法的方法),则发出头文件。
Cmd.undoc_header
如果帮助输出具有未记录命令的部分(即,do_*()
没有相应help_*()
方法的方法),则发出头文件。
Cmd.ruler
用于在帮助消息标题下绘制分隔线的字符。如果为空,则不绘制标尺线。它默认为'='
。
Cmd.use_rawinput
一面旗帜,默认为真。如果为true,则cmdloop()
用于raw_input()
显示提示并阅读下一个命令; 如果错误,sys.stdout.write()
并被sys.stdin.readline()
使用。(这意味着通过readline
在支持它的系统上导入,解释器将自动支持类Emacs
的行编辑和命令历史击键。)