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

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 PromptSession

if __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 PromptSession
    
    if __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 WordCompleter

if __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的颜色

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

from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.styles import Style

if __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 CursorShape

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, 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 KeyBindings


bindings = 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:
            break
    
    sys.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_terminal


bindings = 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:
            break
    
    sys.exit(0)

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


六 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/553364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCIA信息系统业务安全服务资质证书介绍条件要求

CCIA(中国通信工业协会)证书是由中国通信工业协会颁发的一种专业资质证书,旨在评估和认证信息化建设企业在信息化项目建设中提供的服务能力。该证书不涉及技术和产品标准,而是重点强调企业在行业服务方向、安全服务意识和专业服务…

基于Springboot的心灵治愈交流平台

基于SpringbootVue的心灵治愈交流平台的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页展示 系统公告 心理咨询师 心灵专栏 压力测试 小纸条 后台登录界面 后…

CST电磁仿真物体表面的Sheet结构和生成3D Model【基础教程】

由Sheet结构生成3D Model 使用Shell Solid and Thicken Sheet! Modeling > Tools > Shape Tools > Shell Solid or Thicken Sheet Shell Solidor ThickenSheet会根据不同类型的模型提供两种完全不同的功能。 如033.由3D Model生成Cavity 所述&#xff…

量子密钥分发系统设计与实现(一):系统基本架构讨论

经过一段时间讨论,我们了解到量子密钥分发设备是当前量子保密通信系统的基础。从本文开始,我将开启量子密钥分发系统设计与实现系列,详细讨论量子密钥分发设备如何从0到1的搭建。 1.QKD系统总体讨论 QKD系统的核心功能就是为通信双方提供理论…

后端插入数据库问题

IDEA报错:Error updating database. Cause: java.sql.SQLException: Column count doesn’t match value count at row 1 1、看报错消息,SQLException,定位到SQL语句问题 并且看best guess最好猜测,再去找路径下的ShoppingCartMa…

第十二章 屏幕后处理效果

屏幕后处理效果是实现屏幕特效的常见方法。 建立一个基本的屏幕后处理的脚本 屏幕后处理指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。 想要实现屏幕后处理的基础在于抓取屏幕。Unity为我们提供了一个接口-OnRenderImage函数。 声…

【C语言回顾】函数

前言1. 函数的概念和分类2.库函数3. 自定义函数3.1 自定义函数的简单介绍3.2 自定义函数举例 4. 形参和实参4.1 形参4.2 实参4.3 形参和实参的关系4.3.1 理解4.3.2 举例代码和调试 5. 嵌套函数和链式访问5.1 嵌套函数5.2 链式访问 6. 函数的声明和定义6.1 单个文件6.2 多个文件…

Java PDF文件流传输过程中速度很慢,如何解决?

专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…

Https网站接口被黑被恶意调取

背景: 维护的一个网站最近短信接口被黑,发送大量短信。起初以为是在网站内部操作,优化了发送短信前的操作,如添加图形验证码,屏蔽国外IP等。但后续还存在被调取情况,定位排查到是该接口在外部被恶意调取。 …

牛客Linux高并发服务器开发学习第二天

Gcc编译 利用gcc 生成应用时如果不加-o 和应用名,默认生成a.out 可以用./ a.out打开 Gcc工作流程 可执行程序Windows系统中为.exe Linux系统中为.out g也可以编辑c程序 gcc也可以编译cpp代码,只是在编译阶段gcc不能自动共和C程序使用的库进行联接&…

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型(LLMs)已显示出在上下文中学习的能力 给定几个带注释的示例作为演示,LLMs 能够为新的测试输入生成输出然而,现行的上下文学习(ICL)范式仍存在以下明显…

海信发布《黑神话:悟空》定制电视E8N新品,重塑大屏游戏体验

4月17日,在“AI美好生活”2024海信电视E8系列新品发布会上,海信电视官宣成为《黑神话:悟空》全球官方合作伙伴。同时,海信电视还为广大游戏玩家带来了《黑神话:悟空》的显示CP,推出了官方定制电视——旗舰新…

夸克AI PPT初体验:一键生成大纲,一键生成PPT,一键更换模板!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

FineBI 6.0 Linux 部署、ClickHouse 源配置

文章目录 FineBI 概述FineBI 部署安装环境说明1.下载安装包2.安装3.初始化设置4.登录5.快速入门 启动与关闭启动关闭 ClickHouse 源配置开启驱动上传功能驱动上传数据库连接配置基础表属性设置数据导入 FineBI 概述 FineBI 是一款国产的商业智能(BI)软件…

基于Ultrascale+系列GTY收发器64b/66b编码方式的数据传输(一)——Async Gearbox使用及上板测试

于20世纪80年代左右由IBM提出的传统8B/10B编码方式在编码效率上较低(仅为80%),为了提升编码效率,Dgilent Techologies公司于2000年左右提出了64b/66b编码并应用于10G以太网中。Xilinx GT手册中没有过多64b/66b编码介绍&#xff0c…

生活中的洪特规则

不知道你还记不记得高中物理所学的一个奇特的物理规则:洪特规则。 洪特规则是德国人弗里德里希洪特(F.Hund)根据大量光谱实验数据总结出的一个规律,它指出电子分布到能量简并的原子轨道时,优先以自旋相同的方式分别占…

【算法一则】矩阵置零 【矩阵】【空间复用】

题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: …

深度学习 Lecture 9 信息增益、One-hot、回归树、集成树、随机森林、XGBoost模型

一、信息增益(Information Gain) 决定使用什么特征来划分一个节点取决于什么样的特征选择最能减少熵(也就是使纯度最大化) 在决策树中,熵的减少被称为信息增益。 所以如何选择呢? 假设现在有三个特征可以选择&#…

CUDA 以及MPI并行矩阵乘连接服务器运算vscode配置

一、CUDA Vscode配置 (一)扩展安装 本地安装 服务器端安装 (二) CUDA 配置 .vscode c_cpp_properties.json {"configurations": [{"name": "Linux","includePath": ["${workspa…

【NUCLEO-G071RB】004——GPIO-按键EXTI外部中断控制LED闪烁

NUCLEO-G071RB:004——GPIO-按键EXTI外部中断控制LED闪烁 设计目标电路原理图芯片配置程序修改 设计目标 电路原理图 与NUCLEO-G071RB:003——GPIO-按键控制LED灯相同 芯片配置 1、PC13(B1):EXTI外部中断模式&…