python-prompt-toolkit:构建命令行交互的实用工具

命令行工具写多了,就会遇到一个老问题:怎么让用户输入体验好一点?Python 自带的 input() 太原始,GNU readline 配置起来又麻烦。prompt-toolkit 这个库就是专门解决这个问题的,目前在 GitHub 上有 10,489 个 Star。

正文顶部截图

它是个纯 Python 库,专门用来构建交互式命令行应用。不需要复杂配置,import 进来就能用。

核心功能

prompt-toolkit 能做的东西不少,但都是围绕"让用户输入更舒服"这个目标。

首先是语法高亮。输入代码的时候,它能实时根据 Pygments 词法分析器给文字上色。写个简单的 Python REPL,体验就能接近专业编辑器。

多行输入编辑也是基本能力。用户输入换行符不会直接提交,而是继续编辑,适合写代码或者长文本的场景。

代码补全支持得比较完整。可以自定义补全逻辑,从简单的前缀匹配到复杂的上下文感知都能实现。

键绑定方面,它同时支持 Emacs 和 Vi 两种风格。用户可以根据自己的习惯切换,不用强迫所有人适应同一种操作方式。

还有几个实用的小功能:增量搜索(正向和反向都支持)、括号粘贴、鼠标定位、自动建议(类似 fish shell)。这些细节加在一起,输入体验比原生环境好很多。

README区域截图

设计上的特点

prompt-toolkit 没有全局状态。你可以在同一个进程里创建多个独立的输入会话,互不干扰。这个设计对写复杂应用很重要。

依赖也很少,只有 Pygments 和 wcwidth 两个。安装包体积小,不会拖慢项目启动速度。

跨平台支持做得比较到位。Linux、macOS、FreeBSD、OpenBSD 都能跑,Windows 上也能正常工作。Windows 10 之后的终端支持 vt100 转义序列,体验会更好;老版本则回退到 Win32 API。

用起来简单

最简单的用法就三行:

from prompt_toolkit import prompt

answer = prompt('Give me some input: ')
print('You said: %s' % answer)

复杂一点的场景,比如自定义补全、多缓冲区管理、构建全屏 TUI 界面,库里面也都有对应的 API。官方文档和 examples 目录里的示例代码够多,照着改就行。

适合什么场景

如果你在做命令行工具,想要比 input() 更好的输入体验,prompt-toolkit 是个稳妥的选择。它比 GNU readline 更灵活,纯 Python 实现也意味着部署更简单。

ptpython 这个交互式 Python Shell 就是基于 prompt-toolkit 做的,体验比默认的 Python REPL 好很多。从它的效果就能看出这个库的能力。

当然,如果你只是写个脚本,问用户要个文件名,那可能没必要引入这个库。但一旦涉及到多行编辑、代码补全、语法高亮这些需求,它就值得考虑了。

这是个专注于做好一件事的库。它不追求花哨的功能,就是把命令行输入这块做得扎实。对于需要构建交互式命令行应用的 Python 开发者来说,这是个靠谱的工具。

,就是把命令行输入这块做得扎实。对于需要构建交互式命令行应用的 Python 开发者来说,这是个靠谱的工具。

更多推荐