上一篇
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
发表评论