Python cmd模块简介

Python的cmd模块提供了一个简单的框架,用于创建面向行的命令解释器。这些解释器对于测试工具、管理工具和其他需要用户交互的应用程序非常有用。

为什么使用cmd模块?

  • 快速创建交互式命令行界面
  • 自动生成帮助文档和命令补全
  • 简化命令解析和分发
  • 支持命令历史记录
  • 轻松扩展自定义命令

创建基本命令行界面

以下是一个使用cmd模块创建简单命令行界面的基本步骤:

导入cmd模块

首先需要导入cmd模块:

导入模块
import cmd

创建命令解释器类

创建一个继承自cmd.Cmd的类:

创建命令解释器类
class MyCLI(cmd.Cmd):
    """自定义命令行界面"""
    
    # 设置命令提示符
    prompt = 'myapp> '
    
    # 定义命令
    def do_greet(self, arg):
        """问候用户 - 用法: greet [name]"""
        if arg:
            print(f"你好, {arg}!")
        else:
            print("你好!")
    
    # 退出命令
    def do_exit(self, arg):
        """退出应用程序"""
        print("再见!")
        return True  # 返回True表示退出命令行循环

运行命令行界面

在脚本末尾添加以下代码来启动命令行界面:

启动命令行界面
if __name__ == '__main__':
    MyCLI().cmdloop()

完整示例代码

下面是一个功能更完整的命令行应用示例:

完整示例:todo_cli.py
import cmd

class TodoCLI(cmd.Cmd):
    """简单的待办事项管理命令行应用"""
    
    prompt = 'todo> '
    intro = "欢迎使用待办事项管理器! 输入?或help查看帮助"
    
    def __init__(self):
        super().__init__()
        self.tasks = []
    
    def do_add(self, arg):
        """添加新任务: add <任务内容>"""
        if arg:
            self.tasks.append(arg)
            print(f"已添加任务: {arg}")
        else:
            print("错误: 请提供任务内容")
    
    def do_list(self, arg):
        """列出所有任务"""
        if not self.tasks:
            print("没有待办事项")
            return
        
        print("\n待办事项列表:")
        for i, task in enumerate(self.tasks, 1):
            print(f"{i}. {task}")
        print()
    
    def do_done(self, arg):
        """标记任务为已完成: done <任务编号>"""
        if not arg:
            print("错误: 请提供任务编号")
            return
        
        try:
            index = int(arg) - 1
            if 0 <= index < len(self.tasks):
                task = self.tasks.pop(index)
                print(f"已完成: {task}")
            else:
                print(f"错误: 无效的任务编号 {arg}")
        except ValueError:
            print("错误: 任务编号必须是数字")
    
    def do_exit(self, arg):
        """退出应用"""
        print("再见!")
        return True

if __name__ == '__main__':
    TodoCLI().cmdloop()

运行效果演示

python todo_cli.py
欢迎使用待办事项管理器! 输入?或help查看帮助
add 学习Python cmd模块
已添加任务: 学习Python cmd模块
add 编写命令行应用
已添加任务: 编写命令行应用
list
待办事项列表:
1. 学习Python cmd模块
2. 编写命令行应用
done 1
已完成: 学习Python cmd模块
list
待办事项列表:
1. 编写命令行应用
exit
再见!

高级功能

命令自动补全

cmd模块支持命令自动补全功能:

实现命令自动补全
def complete_done(self, text, line, begidx, endidx):
    """为done命令提供自动补全"""
    return [str(i) for i in range(1, len(self.tasks)+1) 
            if str(i).startswith(text)]

自定义帮助系统

覆盖默认的help命令行为:

自定义帮助命令
def do_help(self, arg):
    """显示帮助信息"""
    if arg:
        # 显示特定命令的帮助
        super().do_help(arg)
    else:
        # 显示所有命令的简要帮助
        print("\n可用命令:")
        commands = [name[3:] for name in self.get_names() 
                   if name.startswith('do_')]
        for cmd in commands:
            print(f"  {cmd:<10} - {getattr(self, 'do_' + cmd).__doc__.splitlines()[0]}")
        print("\n输入 help <命令> 查看详细帮助")

执行前/后钩子

使用precmd和postcmd方法在命令执行前后添加自定义逻辑:

使用钩子方法
def precmd(self, line):
    """在命令执行前调用"""
    print(f"[DEBUG] 即将执行命令: {line}")
    return line

def postcmd(self, stop, line):
    """在命令执行后调用"""
    print(f"[DEBUG] 已执行命令: {line}")
    return stop