不论战术上如何变化,千万不要忘记战略目标。


在前些时候小白已经使用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()


哈哈,可以运行起来!可以看的出在代码中,按代码的复用尺度来分,从小到大应该是:代码行→函式→类→模块

好像还有更大的一级包,具体现在还用不上,那就先不管它了。