Python cmd2:大版本升级指南
- 1Python cmd2:构建强大的命令行解释器
- 2Python cmd2:表格创建
- 3Python cmd2:测试指南
- 4Python cmd2:大版本升级指南本文
- 5Python cmd2:功能总览
- 6Python cmd2:混入类(Mixin)详解
- 7Python cmd2:主题
- 8Python cmd2:注解式参数处理
- 9Python cmd2:参数处理详解
- 10Python cmd2:操作系统集成
- 11Python cmd2:钩子机制详解
- 12Python cmd2:脚本功能详解
- 13Python cmd2:快捷方式、别名与宏
- 14Python cmd2:命令、补全与禁用命令
- 15Python cmd2:命令历史功能详解
- 16Python cmd2:模块化命令详解
- 17Python cmd2:嵌入式 Python Shell、生成输出与帮助系统
- 18Python cmd2:设置系统与插件系统详解
- 19Python cmd2:提示符定制、输出重定向与管道
- 20Python cmd2:异步命令、内置命令与剪贴板集成
- 21Python cmd2:应用初始化、多行命令与启动命令
- 22Python cmd2:杂项功能与应用打包分发
cmd2 大版本升级
从 3.x 升级到 cmd2 4.x
从 3.x 到 4.x 最大的变化是从 GNU Readline 库迁移到 prompt-toolkit 来实现 REPL(读取-求值-打印循环)。这一变更提供了 readline 的纯 Python 替代品,完全跨平台兼容,并在功能和可扩展性方面带来了显著增强。
prompt-toolkit 迁移
cmd2 现在使用 prompt-toolkit 处理所有输入、历史导航和 Tab 补全。这移除了对 GNU Readline 库(以及 macOS 上的 gnureadline 包)的依赖。
prompt-toolkit 的主要优势
- 跨平台:在 Windows、macOS 和 Linux 上行为完全一致,无需外部依赖。
- 异步输出:更好地支持向终端异步打印,同时不干扰用户的输入行。
- 增强的 UI:支持底部工具栏、浮动菜单等高级 UI 元素。
- 多行编辑:改进了对跨多行命令的编辑支持。
破坏性变更与不兼容之处
尽管我们努力保持兼容,但仍存在一些差异:
- 键绑定:键绑定现在由
prompt-toolkit管理。虽然默认仍是 Emacs 风格绑定(与 readline 类似),但自定义方式改为使用prompt-toolkit的 KeyBindings API。 - 输入钩子:不再支持 readline 特有的输入钩子。
底部工具栏
cmd2 现在支持可选的持久底部工具栏,可用于显示应用名称、当前状态甚至实时时钟等信息。
- 启用:在
cmd2.Cmd.__init__构造函数中设置enable_bottom_toolbar=True。 - 自定义:重写
cmd2.Cmd.get_bottom_toolbar方法,返回你希望显示的内容。
参阅 getting_started.py 示例,了解如何实现定期刷新工具栏的后台线程。
自定义补全菜单颜色
cmd2 现在使用 prompt-toolkit 实现 Tab 补全菜单,并可通过 cmd2 主题自定义其外观。
- 自定义:使用
cmd2.theme.update_theme()覆盖Cmd2Style.COMPLETION_MENU_CURRENT和Cmd2Style.COMPLETION_MENU_META样式。详见自定义补全菜单颜色。
已删除的模块
移除了 rl_utils.py 和 terminal_utils.py,因为 prompt-toolkit 已提供这些功能。
从 2.x 升级到 cmd2 3.x
关于 3.0.0 版本所有变更的详细信息,请参阅 CHANGELOG.md。
从 2.x 到 3.x 最大的变化是 cmd2 现在依赖 rich。相应地,cmd2 依靠 rich 在终端中进行精美的文本样式设置和格式化。因此,cmd2 中大量自定义代码被移除,其他内容也有所变动或改为基于 rich 实现。
升级到 3.x 时用户应注意的主要变化详述如下各小节。
已删除的模块
ansi
cmd2.ansi 模块中的功能或已被移除,或改为基于 rich 并移动到以下新模块之一:cmd2.colors、cmd2.string_utils 或 cmd2.styles。
为了简化从 cmd2 2.x 到 3.x 的迁移路径,我们以独立包的形式创建了 cmd2-ansi 模块,它是 cmd2 2.7.0 中 cmd2.ansi 模块的向后移植。相关链接:
使用此向后移植包:
from cmd2_ansi import ansitable_creator
cmd2.table_creator 模块已不复存在。更多信息请参阅 rich 关于 Tables 的文档。rich_tables.py 示例演示了如何在 cmd2 应用中使用 rich 表格。
rich 表格提供了比 cmd2 之前所提供的更强大的能力和灵活性。对于这一向后不兼容我们深表歉意,但两者的 API 根本不同,我们无法设计出一个向后兼容的包装层。
为了简化从 cmd2 2.x 到 3.x 的迁移路径,我们以独立包的形式创建了 cmd2-table 模块,它是 cmd2 2.7.0 中 cmd2.table_creator 模块的向后移植。相关链接:
- PyPI:cmd2-table
- GitHub:cmd2-table
使用此向后移植包:
from cmd2_table import table_creator新增模块
colors
新的 cmd2.colors 模块提供了便捷的 cmd2.colors.Color StrEnum 类,用于表示 rich 颜色名称。这让你可以在代码中使用可 Tab 补全的常量,而不是魔法字符串来表示所需的确切颜色。
参阅 getting_started.py 了解使用 Color 类为输出选择颜色的基础示例。或者参阅 color.py 示例,直观查看所有受支持的颜色。
rich_utils
新的 cmd2.rich_utils 模块提供了在 cmd2 应用中支持 rich 使用的通用工具类和函数。其中大部分内容并非面向最终用户。
许多 cmd2 应用开发者可能会感兴趣的是 cmd2.theme.update_theme 函数。参阅 rich_theme.py 示例,了解如何为你的应用设置主题(配色方案)。
styles
错误消息等信息的默认显示样式现在位于新的 cmd2.styles 模块中,并且基于 rich 样式。
此前 cmd2 的默认样式位于 cmd2.ansi 模块中。
参阅 argparse_completion.py 示例,了解如何在 cmd2 应用中利用这些默认样式来保持一致的外观。
string_utils
各种字符串工具函数已从 cmd2.ansi 模块移至新的 cmd2.string_utils 模块。
其中包括用于文本样式化、对齐以及加引号/去引号的函数。参阅 getting_started.py 示例,了解如何使用通用的 cmd2.string_utils.stylize 函数。
terminal_utils
设置窗口标题、异步警报等终端控制转义序列的支持已从 cmd2.ansi 移入主 cmd2.Cmd 应用类中。
这部分并非供最终用户直接使用,而是供 cmd2.Cmd.set_window_title 和 cmd2.Cmd.add_alert 等面向最终用户的高层功能使用。
参阅 async_printing.py 了解如何在 cmd2 应用中使用此功能。
Argparse HelpFormatter 类
cmd2 现在有 5 个不同的 Argparse HelpFormatter 类,它们全部基于 rich-argparse 的 RichHelpFormatter 类:
cmd2.rich_utils.Cmd2HelpFormattercmd2.rich_utils.ArgumentDefaultsCmd2HelpFormattercmd2.rich_utils.MetavarTypeCmd2HelpFormattercmd2.rich_utils.RawDescriptionCmd2HelpFormattercmd2.rich_utils.RawTextCmd2HelpFormatter
此前默认的 Cmd2HelpFormatter 类继承自 argparse.RawTextHelpFormatter,但现在它继承自 argparse.HelpFormatter。如果你想要 RawText 行为,请向解析器传入 formatter_class=RawTextCmd2HelpFormatter。
好处是你的 cmd2 应用现在拥有更赏心悦目的帮助信息,包含颜色,能让你更快速、更轻松地目视解析帮助文本。这适用于所有受支持的 Python 版本。
其他变更
cmd2.Cmd.__init__的auto_load_commands参数现在默认为False- 用更 Python 风格的
value属性取代了Settable.get_value()和Settable.set_value()方法 - 移除了
with_argparser()装饰器中对解析器prog值的冗余设置,因为现在由Cmd._build_parser()统一处理
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













