- 论坛徽章:
- 0
|
今天看 gadfly 的源碼時,看到一段代碼:
class GadflyShell(cmd.Cmd):
prompt = 'GF> '
prompt2 = '... '
# ... 省略
很好奇,遂搜索相關信息。
類cmd.cmdloop 中執行流程如下:
cmdloop()
|
|
|-- [VF]preloop()
|-- while not stop:
|
|-- read line
|-- [VF]precmd()
|-- onecmd()
|-- [VF]postcmd()
+-- [VF]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()
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/10686/showart_2072067.html |
|