使用prompt_toolkit构建交互式命令行工具

embedded/2024/9/24 0:21:22/

prompt_toolkit是一个python库,用于构建命令行工具和终端应用。其官网介绍如下,

prompt_toolkit is a library for building powerful interactive command line and terminal applications in Python.

安装命令如下,

pip install prompt_toolkit

PS:本文写作时prompt_toolkit版本是3.0.43

本文讲述如何使用prompt_toolkit 3.x版本来构建交互式命令行工具,参考文档是官方教程


一 基本命令行

首先构建一个基本命令行,

from prompt_toolkit import PromptSessionif __name__ == "__main__":session = PromptSession()while True:user_input = session.prompt("> ")print(user_input)

这里没有使用prompt_toolkit.prompt,而是prompt_toolkit.PromptSession,有2个优点:

  • PromptSession可以自动开启历史功能,prompt则需要配置参数

  • 在多次输入情况下,prompt的参数需要传递多次,也就是每次都要使用prompt创建对象并传参,而PromptSession可以只传递一次,就是传给PromptSession(),

    from prompt_toolkit import PromptSessionif __name__ == "__main__":session = PromptSession('> ') # 参数传给PromptSession(),不需要在while循环里给PromptSession的prompt方法传参了while True:user_input = session.prompt()print(user_input)
    

    当然也可以传给PromptSession的prompt()方法

可以看出PromptSession更加方便好用。


二 开启补全功能

一般来说,命令行下可输入的有效命令都是一堆固定值,所以当我们输入命令的一部分时,希望能给出补全提示,代码如下,

from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleterif __name__ == "__main__":mycompleter = WordCompleter(['A1', 'A2', 'A3', 'B1', 'B11'])session = PromptSession('> ', completer=mycompleter)while True:user_input = session.prompt()print(user_input)

代码里使用prompt_toolkit.completion中的WordCompleter来存入命令列表,并作为参数传递给PromptSession()

运行后输入A,可以看到会自动弹出允许的命令列表,然后使用上下键来选择需要的命令并回车,
在这里插入图片描述


prompt_71">三 设置prompt的颜色

默认prompt的颜色是这种白色,有时希望是其它颜色,

from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.styles import Styleif __name__ == "__main__":mystyle = Style.from_dict({# User input (default text).'':          '#ff0066',# Prompt.'pound':    '#00aa00', # 通过pound来进行关联,可以改成别的名字})message = [('class:pound',    '> '), # pound对应'>']mycompleter = WordCompleter(['A1', 'A2', 'A3', 'B1', 'B11'])session = PromptSession(message, style=mystyle, completer=mycompleter)while True:user_input = session.prompt()print(user_input)

运行后如下,
在这里插入图片描述
可以看到,不仅修改了prompt的颜色,同时也修改了输入字符的颜色


四 设置光标

前面的例子可以看出,默认的光标是不动的,有时希望光标可以闪烁,表示程序正在运行,那么可以修改如下,

from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.styles import Style
from prompt_toolkit.cursor_shapes import CursorShapeif __name__ == "__main__":mystyle = Style.from_dict({# User input (default text).'':          '#ff0066',# Prompt.'pound11':    '#00aa00',})message = [('class:pound11',    '> '),]mycompleter = WordCompleter(['A1', 'A2', 'A3', 'B1', 'B11'])session = PromptSession(message, style=mystyle, completer=mycompleter, cursor=CursorShape.BLINKING_BEAM)while True:user_input = session.prompt()print(user_input)

代码里使用了prompt_toolkit.cursor_shapes里的CursorShape

运行后可以看出光标在闪烁。


五 优雅处理Ctrl+C和其它按键

前面的例子运行时,我们按Ctrl+C结束程序都会打印一堆信息,看上去很不优雅,这里对代码进行如下修改,

import sys
from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.styles import Style
from prompt_toolkit.cursor_shapes import CursorShape
from prompt_toolkit.key_binding import KeyBindingsbindings = KeyBindings()@bindings.add('c-c')
def _(event):" Exit when `ctrl-c` is pressed. "event.app.exit()if __name__ == "__main__":mystyle = Style.from_dict({# User input (default text).'':          '#ff0066',# Prompt.'pound11':    '#00aa00',})message = [('class:pound11',    '> '),]mycompleter = WordCompleter(['A1', 'A2', 'A3', 'B1', 'B11'])session = PromptSession(message, key_bindings=bindings, style=mystyle, completer=mycompleter, cursor=CursorShape.BLINKING_BEAM)while True:user_input = session.prompt()if user_input is not None:print(user_input)else:breaksys.exit(0)

这里使用了prompt_toolkit.key_binding里的KeyBindings,对按键事件进行处理,代码里对Ctrl+C进行处理

如果想对某些按键进行特殊处理,例如"[",那么可以仿照着进行修改,

import sys
from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.styles import Style
from prompt_toolkit.cursor_shapes import CursorShape
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.application import run_in_terminalbindings = KeyBindings()@bindings.add('c-c')
def _(event):" Exit when `ctrl-c` is pressed. "event.app.exit()@bindings.add('[')
def _(event):def print_hello():print('hello world')run_in_terminal(print_hello)if __name__ == "__main__":mystyle = Style.from_dict({# User input (default text).'':          '#ff0066',# Prompt.'pound11':    '#00aa00',})message = [('class:pound11',    '> '),]mycompleter = WordCompleter(['A1', 'A2', 'A3', 'B1', 'B11'])session = PromptSession(message, key_bindings=bindings, style=mystyle, completer=mycompleter, cursor=CursorShape.BLINKING_BEAM)while True:user_input = session.prompt()if user_input is not None:print(user_input)else:breaksys.exit(0)

对于’[‘的处理,使用了run_in_terminal()函数,这个函数可以保证按下’['之后还能继续在命令程序下,不会退出,不过这个函数需要传递一个参数,这个参数是函数。


六 总结

本文讲述了如何使用prompt_toolkit来构建交互式命令行工具,实现了一些常用功能。可以看出prompt_toolkit功能非常强大,其实际功能远不止本文介绍的,详情可以看官方文档。


http://www.ppmy.cn/embedded/5902.html

相关文章

“Python+”集成技术高光谱遥感数据处理与机器学习深度应用

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论,旨在帮助学员深入理解科学原理。结合Python编程工具,专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题,…

XiaodiSec day033 Learn Note 小迪渗透学习笔记

XiaodiSec day033 Learn Note 小迪渗透学习笔记 记录得比较凌乱,不尽详细 day33 文件上传 中间件上传,学了也不一定遇得到,但是要学 文件上传漏洞有几个情况会导致,有后端验证,第三方富文本编辑器导致 编辑器被目…

原型对象、实例、原型链的联系

const F function () { this.name Jack } // ƒ () { this.name Jack }const e new F() // F { name: "Jack" }console.log(e.name) // Jack 构造函数:现在 F 就是构造函数。任何一个函数被 new 使用后,就是构造函数,没被…

Flutter-----异步编程:Future和Stream

异步编程:使用 Future 和 async-await | Dart 什么是异步操作/异步操作的作用? Dart 代码运行在单个执行“线程”中。如果 Dart 代码在执行时阻塞,例如:处理一个需要长时间运行的计算操作或等待 I/O 完成。此时整个程序会被“冻…

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测,主要用于评估用户是否眨眼。 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

CloudCompare 整体架构

CloudCompare 是一个开源的大规模点云处理软件,内置了点云渲染和各种点云算法,还有插件化拓展,非常适合作为点云相关软件的基础程序进行二次开发。源码地址:https://github.com/CloudCompare/CloudCompare 这里记录一下项目的主要模块目录和他们做的事情。 编译和依赖 编…

营业执照OCR接口在电商行业中的具体应用

在当今快速发展的电子商务时代,营业执照OCR接口技术的应用为电商行业带来了深远的影响。这项技术通过自动识别和提取营业执照图像中的文字信息,不仅极大提高了数据处理的速度和准确性,而且还为电商平台的风险管理和用户体验优化提供了强有力的…

第64天:服务攻防-框架安全CVE复现Apache ShiroApache Solr

目录 思维导图 案例一:Apache Shiro-组件框架安全 shiro反序列化 cve_2016_4437 CVE-2020-17523 CVE-2020-1957 案例二:Apache Solr-组件框架安全 远程命令执行 RCE(CVE-2017-12629) 任意文件读取 AND 命令执行&#xff08…