Chinaunix首页 | 论坛 | 博客
  • 博客访问: 473307
  • 博文数量: 65
  • 博客积分: 2645
  • 博客等级: 少校
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-08 17:04
文章分类

全部博文(65)

文章存档

2010年(5)

2009年(5)

2008年(14)

2007年(35)

2006年(6)

分类: Python/Ruby

2009-10-16 17:09:52

今天看 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()


阅读(1676) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~