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

news2024/11/29 12:31:19

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功能非常强大,其实际功能远不止本文介绍的,详情可以看官方文档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024Guitar Pro 8.1 Mac 最新下载、安装、激活、换机图文教程

吉他爱好者必备神器:Guitar Pro v8.1.1 Build 17深度解析 随着数字音乐制作和学习的日益普及,越来越多的吉他爱好者开始寻找能够帮助他们提升技能、创作音乐的专业工具。在众多吉他制作软件中,Guitar Pro因其强大的功能和易用的界面备受推崇…

03-JAVA设计模式-中介者模式

中介者模式 什么是中介者模式 中介者模式(Mediator Pattern)是一种行为设计模式,用于减少对象之间的直接依赖关系,降低它们之间的耦合度,并使得一个对象改变时,所有依赖于它的对象都得到通知并自动更新。…

【QT学习】7.事件,把文本显示在页面中(文本可变),鼠标指针切换,鼠标左键右键按下,qt设置背景样式

0.创建项目,事件的创建 1.事件的位置 2.这就是多态,子类重写父类函数,子类调用子类函数,也可以调用父类函数。但同函数名 1.要求:文本显示在页面中(文本可变) 1.文本显示在页面的核心代码 主要步…

链表OJ - 5(合并两个有序链表)

题目描述(来源) 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路 需创建一个头结点,然后从两个链表的表头开始依次比较传入的两个链表的结点的大小,并将两个链表中较小的…

Docker构建Golang项目常见问题

Docker构建Golang项目常见问题 1 dockerfile报错:failed to read expected number of bytes: unexpected EOF2 go mod tidy: go.mod file indicates go 1.21, but maximum supported version is 1.17 1 dockerfile报错:failed to read expected number o…

Linux编辑器gcc/g++的使用以及Makefile的用法

gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] gcc对code.c编译形成可执行文件mybin,十分推荐直接这样写,下面会有拆分写法(不推荐) gcc与我们使用过的编辑器无二,都需要经过 1. 预处理(…

QAnything部署Mac m1环境

本次安装时Qanything已经更新到了v1.3.3,支持纯python安装。安装过程比较简单,如下: QAnything/README_zh.md at qanything-python-v1.3.1 netease-youdao/QAnything GitHub 首先需要用Anaconda3创建隔离环境,简要说明下Anaco…

Word分节后,页码不连续、转PDF每节后多出空白页解决办法

1. 问题图例 废话少说,先上图: 2. 问题分析 问题分析:出现以上问题的原因可能有, 未链接到上一节页面布局中节的起始位置设置为[奇数页] 3. 解决问题 若为【1. 未链接到上一节】导致该问题出现,则我们需要选中页脚…

PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器

文章目录 1.前言2.CellNet2.1CellNet简介2.2CellNet结果 3.PACNet3.1安装R包与加载R包3.2加载数据3.3开始训练和分类3.4可视化分类过程3.5可视化分类结果 4.细胞命运分类和免疫浸润比较 1.前言 今天冲浪看到一个细胞分类性能评估的R包——PACNet,它与转录组分析方法…

Easy GIS .NET GMap.Net

Easy GIS .NET & GMap.Net .NET 环境下非常简单的GIS地图开发库。 Easy GIS .NET 一个简单的GIS 桌面应用程序,实现了地图瓦片加载、shapefile文件和csv文件加载渲染、地图坐标系统设置及转换等等基本功能,非常简单易用。 Easy GIS .NET is an o…

论文浅尝 | QA-GNN:结合语言模型与知识图谱进行问答推理

笔记整理:项卓怡,浙江大学硕士,研究方向为生化大模型。 链接:https://arxiv.org/abs/2104.06378 Code:https://github.com/michiyasunaga/qagnn Citation: Yasunaga M, Ren H, Bosselut A, et al. QA-GNN: Reasoning w…

pytest学习-pytorch单元测试

pytorch单元测试 一.公共模块[common.py]二.普通算子测试[test_clone.py]三.集合通信测试[test_ccl.py]四.测试命令五.测试报告 希望测试pytorch各种算子、block、网络等在不同硬件平台,不同软件版本下的计算误差、耗时、内存占用等指标. 本文基于torch.testing._internal 一…

Python基于Django搜索的目标站点内容监测系统设计,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Android Studio XML 预览View 底部移动到右边

以前 XML 的预览都是在右边的,最近不知道为什么突然到下面去了,很不习惯 找半天想把 预览view 移动到右边,一直没找到按钮。 误打误撞移回来了,原来只要再点击一次 split,就可以变动位置了,记录一下。

ChatGPT及GIS、生物、地球、农业、气象、生态、环境科学领域案例

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

C++教你如何模拟实现string,如何实现string写时拷贝

文章目录 前言成员变量默认成员函数默认构造函数拷贝构造函数析构函数赋值运算符重载 容量相关函数(Capacity)reserve函数resize函数size函数capacity 函数clear函数 修改函数(Modifiers)swap函数insert函数字符插入字符串插入 ap…

未来城市可视化,A3D引擎支持,免费搭建全新一代数字孪生!

AMRT3D数字孪生引擎https://www.amrt3d.com/#/ 什么是未来城市?它是新型数字化理念的载体,以数字孪生与物理世界城市的融合为核心,通过数字孪生技术在数字空间实时构建城市,采用数据整合和分析预测来实时模拟、预测、控制整体城市…

uniapp之消除图片的空白占用空间

我们在使用uniapp开发的过程中一定会遇到一个情况就是我们加载的图片总有一点空白出现在不该出现的地方代码如下 <view style"background:#ff0000;"><image style"width:100%;"src"https://t7.baidu.com/it/u1819248061,230866778&fm19…

[论文笔记]Root Mean Square Layer Normalization

引言 今天带来论文Root Mean Square Layer Normalization的笔记&#xff0c;论文题目是均方根层归一化。 本篇工作提出了RMSNorm&#xff0c;认为可以省略重新居中步骤。 简介 层归一化对Transformer等模型非常重要&#xff0c;它可以帮助稳定训练并提升模型收敛性&#xf…

uniapp-小程序保存图片到相册

小程序保存图片到相册 一. 将图片保存到手机相册涉及的api 有以下几个 1. uni.getSetting (获取用户的当前设置) 2. uni.authorize&#xff08;提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据&#xff0c;但不会实际调…