在前些时候小白已经使用getopt获得命令行工具。
但是,要完成一个个看似简单,实际有 N 多情况的逻辑判定就有点烦人了。
热心的行者,又出声了:“使用 cmd 吧!”
cmd模块,是一个专门支持命令行界面的模块。让我们来重构一下它:
# -*- coding: utf-8 -*- import sys import cmd class PyCDC(cmd.Cmd): def __init__(self): # 初始化基类,类的定量应该都在初始化时声明 cmd.Cmd.__init__(self) # 定义命令行提示符 self.prompt = ">" # 定义walk命令所执行的操作 def do_walk(self, filename): if filename == "": filename = input("请输入cdc文件名:") print("扫描光盘内容保存到:'%s'" % filename) # 定义walk命令的帮助输出 def help_walk(self): print("扫描光盘内容 walk cd and export init '.cdc'") # 定义dir命令所执行的操作 def do_dir(self, pathname): if pathname == "": pathname = input("请输入指定保存/搜索目录:") # 定义dir(命令的帮助输出 def help_dir(self): print("指定保存/搜索目录") # 定义find命令所执行的操作 def do_find(self, keyword): if keyword == "": keyword = input("请输入搜索关键词:") # 定义find命令的帮助输出 def help_find(self): print("搜索关键词") # 定义quit命令所执行的操作 def do_quit(self, arg): sys.exit(1) # 定义quit命令的帮助输出 def help_quit(self): print("Syntax:quit") print("--terminates the application") # 定义quit的快捷方式 do_q = do_quit if __name__ == '__main__': cdc = PyCDC() cdc.cmdloop()
运行效果如下:
>help Documented commands (type help <topic>): ======================================== dir find help quit walk Undocumented commands: ====================== q >dir 请输入指定保存/搜索目录:cdc >walk 请输入cdc文件名:test.cdc 扫描光盘内容保存到:'test.cdc' >?find 搜索关键词 >xx *** Unknown syntax: xx >q >>> ========================== >find 请输入搜索关键词:images >quit
可以看到,此代码纯粹是用来尝试cmd模块功能的,只能打印输出信息,没有任何实际作用。
从这个例子可以看出,首先PyCDC类继承cmd.Cmd类,然后在类中定义了walk,dir,find和quit,而命令q被作为quit的短命令形式。(也就是说,若须另外定义一条命令,如command,只要在PyCDC类中增加一个 do_command 函式)而该命令对应的帮助信息由help_command 函式给出。
就像示例中所写的那样,自定义的PyCDC类提供了的命令,是可以正常使用它们的,而xx命令是没有定义的,所以命令行提示为未知语法。最后的q命令和quit是一样的功能,即退出程序。
# -*- coding: utf-8 -*- import os import sys from cdctools import * # 可以引入己有脚本cdctools中的所有函数 def cdWalker(cdrom, cdcfile): export = "" for root, dirs, files in os.walk(cdrom): export += "\n %s;%s;%s" % (root, dirs, files) open(cdcfile, 'w').write(export) if __name__ == "__main__": cdc = PyCDC() cdc.cmdloop()
哈哈,可以运行起来!可以看的出在代码中,按代码的复用尺度来分,从小到大应该是:代码行→函式→类→模块
好像还有更大的一级包,具体现在还用不上,那就先不管它了。
原文地址:http://blog.51cto.com/9473774/2090044