使用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 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的颜色

默认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.mzph.cn/diannao/2605.shtml

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

相关文章

朴素贝叶斯算法分类

def loadDataSet():postingList[[my, dog, has, flea, problems, help, please], #切分的词条[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, posting, stupid, worthless, garbage],[mr, licks, ate, my, steak, …

HarmonyOS开发案例:【相机开发】

基本概念 相机是OpenHarmony多媒体进程提供的服务之一,提供了相机的录像、预览、拍照功能,支持多用户并发取流。 在进行应用的开发前,开发者应了解以下基本概念: 视频帧 视频流指的是将一系列图片数据按照固定时间间隔排列形成的…

2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介: 2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗,并使无人机能够适应复杂环…

Leetcode 第 393 场周赛题解

Leetcode 第 393 场周赛题解 Leetcode 第 393 场周赛题解题目1:3114. 替换字符可以得到的最晚时间思路代码复杂度分析 题目2:3115. 质数的最大距离思路代码复杂度分析 题目3:3116. 单面值组合的第 K 小金额思路代码复杂度分析 题目4&#xff…

使用BibTeX导入参考文献到Overleaf项目(常用方法)

使用bib为overleaf导入参考文献的好处 整洁的管理: 使用 .bib 文件可以使你的参考文献管理更加整洁和有条理。你可以将所有的参考文献集中存储在一个文件中,而不是在文档中直接引用或复制粘贴。 易于维护和更新: 当你需要添加、删除或修改参考…

申请泛域名证书步骤

泛域名证书的广泛应用范围: 泛域名证书不同于普通的单域名数字证书和多域名数字证书,可以一次以一张证书对应无限多的域名,在功能性和方便性上远优于一般证书。 单域名证书顾名思义,一张证书只对应一个独立域名,多域…

迅睿CMS内容删除后ID重置与指定起始值操作指南

在使用迅睿CMS进行内容管理时,经常会涉及到内容的增删改查。本文将介绍如何在删除内容后重置ID值,或指定ID值从某一特定数开始自增,以便于更好的管理数据。 ID重置操作 共享模块ID重置 在执行删除操作时,若需要对共享模块的内容…

Unity类银河恶魔城学习记录13-4 p145 Save Skill Tree源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili GameData.cs using System.Collections; using System.Collections.Generic…

投票刷礼物链接怎么弄?最新投票活动创建系统源码 轻松创建活动

投票刷礼物链接怎么弄?投票活动创建系统的作用和功能多种多样,为用户提供一个便捷、高效且功能强大的平台,用于创建、管理和执行各种投票活动。分享一个最新投票活动创建系统源码,源码开源可二开,含完整代码包和详细搭…

【机器学习书籍推荐】机器学习算法原理与编程实践(附PDF)

哈喽啊大家&#xff0c;今天又来给大家推荐一本机器学习方面的书籍<机器学习算法原理与编程实践>。本书适用于中高水平的程序设计人员、大学理科生、以及对机器学习感兴趣的各类爱好者。 《机器学习算法原理与编程实践》围绕神经网络、智能推理、矩阵计算三大主线&#…

BM25检索算法 python

1.简介 BM25&#xff08;Best Matching 25&#xff09;是一种经典的信息检索算法&#xff0c;是基于 TF-IDF算法的改进版本&#xff0c;旨在解决、TF-IDF算法的一些不足之处。其被广泛应用于信息检索领域的排名函数&#xff0c;用于估计文档D与用户查询Q之间的相关性。它是一种…

【树莓派学习】开发环境配置

【树莓派学习】开发环境配置 ​ Raspberry Pi OS作为基于Linux的系统&#xff0c;其默认网络配置在国内的网络环境下容易出现访问慢甚至无法连接等问题&#xff0c;不便于我们的学习&#xff0c;同时&#xff0c;树莓派上C/C的使用需要单独安装WiringPi。本文主要介绍如何更改…

JavaScript系列------1

1. JavaScript组成 ECMAScript JS 语言基础。比如&#xff1a;变量、分支语句、循环语句、对象等等。 Web APIs DOM(页面文档对象模型): 操作文档&#xff0c;比如对页面元素进行移动、大小、添加删除等操作 BOM(浏览器对象模型): 操作浏览器&#xff0c;比如页面弹窗&#x…

javaScript中的闭包

什么是闭包 在理解 JavaScript 中的闭包前先了解以下两个知识点&#xff1a; JavaScript 中的作用域和作用域链JavaScript 中的垃圾回收 简单回顾一下这两个知识点&#xff1a; 1. JavaScript 中的作用域和作用域链 作用域就是一个独立的地盘&#xff0c;让变量不会外泄、…

开发简易复用 SDK(项目加分项)

文章目录 开发 SDK新建项目修改pom文件删除启动类创建配置类复制之前的客户端新建spring.factories打包 开发 SDK 为什么要开发SDK。 减少代码的冗余提高代码的复用 如果实际项目中需要使用到该SDK&#xff0c;在pom.xml中注入就可以了。 类似于maven一样&#xff0c;把需要…

女生学习PLC专业,好就业吗?

好就业&#xff0c;plc找工作容易 但不建议女生做PLC相关工作&#xff0c; plc的工作会涉及现场安装调试&#xff0c;难免体力或者登高爬梯&#xff0c;对女生来说有点辛苦。还都会长期出差&#xff0c;身体辛苦之外&#xff0c;心理是煎熬&#xff0c;初入行时出差或许是乐事…

【FX110网】股市、汇市一年有多少个交易日?

事实上&#xff0c;作为交易者&#xff0c;重要的是要了解并非每天都是交易日。虽然金融市场在大多数工作日开放交易&#xff0c;但在某些特定情况下无法进行交易。这些非交易日可能因各种原因而发生&#xff0c;包括节假日、周末和市场休市。 通过随时了解假期、交易时间表和市…

实施阶段(2024年4月)

【活动二】编程解决问题&#xff0c;二分查找法统计查字典次数。 任务要求&#xff1a;假设字典为1000页&#xff0c;若用二分法来翻到用户输入的具体指定的页数&#xff0c;则需要的最大查找次数为&#xff1f; 设计算法&#xff1a; 取总页码数据中间值&#xff0c;将待查数…

恶意软件狩猎新途径:使用.NET元数据分析跟踪恶意软件

本文由Blaze于2024年3月25日发表于其个人博客网站上。 就在不久前&#xff0c;我们意外发现了一个PureCrypter样本&#xff0c;而PureCrypter则是一款适用于各种类型恶意软件&#xff08;例如Agent Tesla和RedLine&#xff09;的加载器和混淆处理工具。深入分析之后&#xff0c…

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多&#xff0c;浏览他们最喜欢的网站&#xff0c;点击电子邮件链接&#xff0c;或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用&#xff0c;但也会使组织面临一系列安全和业务风险&#…