python 中的 cmd 模塊

1703阅读 0评论2009-10-16 libin1983
分类:Python/Ruby

今天看 gadfly 的源碼時,看到一段代碼:


class GadflyShell(cmd.Cmd):
    prompt = 'GF> '
    prompt2 = '... '
    # ... 省略

很好奇,遂搜索相關信息。


類cmd.cmdloop 中執行流程如下:

cmdloop()
|
|
|-- [VF]preloop()
|-- while not stop:
      |
      |-- read line
      |-- [VF]precmd()  #命令执行过前的操作可以放在这里
      |-- onecmd()      
      |-- [VF]postcmd() #命令执行过后的操作可以填在这
|-- postloop()   #循环结束后执行的操作可以添加到这

Note: [VF] - virtual member function


運行時,接收用戶輸入格式為:
命令 + 字符串
命令: 由 a-z, A-Z, 0-9 及 下劃綫 構成

其中

a. 如果命令為?:

執行 do_help 函數, 相當與 do_help 的快捷方式

b. 如果命令為! :

如果定義了 do_shell, 則執行 do_shell函數, 有點像 do_shell 的快捷方式 :)

c. 如果不輸入命令直接按回車:

不輸入信息, 直接按回車, 執行 self.emptyline(), 默認為重複上一條命令。如果不想這樣,需要重定義 emptyline()

d. 程序的命令提示符默認為 :(Cmd),如果你想改變,請重置類中成員變量 prompt

e. 程序中定義一個命令很簡單,定義一個函數即可.

函數格式: 


def do_cmdname(self, arg):
    """
    arg 獲取的值為 字符串類型
    "
""
    ...

如果函數返回了一個 not false 的值, 則程序會退出!

我寫的測試程序:



import cmd
import sys
import time

import os

class MyTest(cmd.Cmd):
    prompt="$"
    def __init__(self):
        cmd.Cmd.__init__(self)
    pass

    def do_test(self, arg):
        print "%s: "%type(arg), arg
        pass

    def precmd(self, line):
        """do sth: connect to db or ..."""
        return line

    def postcmd(self, stop, line):
        print "[Input is '%s', state is %s]"%(line,stop)
        sys.stdout.flush()
        return stop

    def do_shell(self,arg):
        os.system(arg)
        pass

    def do_exit(self, arg):
        #sys.exit(0)
        return "bye"


a = MyTest()
a.cmdloop()


上一篇:今天碰到的小警告
下一篇:HP-UX 中殺後臺程序的腳本