我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python怎么快速构建命令行用户界面

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python怎么快速构建命令行用户界面

这篇文章主要介绍“Python怎么快速构建命令行用户界面”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么快速构建命令行用户界面”文章能帮助大家解决问题。

Python Prompt Toolkit

我习惯于把这个库称为命令行应用的瑞士军刀,它可以作为readline、curses等的替代品。让我们首先安装这个库,然后开始该教程:

pip install prompt_toolkit

我们以一个简单的 REPL (LCTT 译注:REPL —— Read-Eval-Print Loop,交互式开发环境)开始。一个典型的 REPL 会接收用户的输入,进行一个操作,然后输出结果。比如在我们的例子中,我们将要实现一个具有 “回显” 功能的 REPL 。它仅仅是原样打印出用户的输入:

REPL

from prompt_toolkit import promptwhile 1:   user_input = prompt('>')   print(user_input)

这就是实现 REPL 的全部代码。它可以读取用户的输入,然后打印出用户的输入内容。在这段代码中使用的prompt函数来自 prompt_toolkit库,它是readline库的一个替代品。

命令历史

为了增强我们的 REPL 的功能,我们可以添加命令历史:

from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistorywhile 1:   user_input = prompt('>',                       history=FileHistory('history.txt'),                      )   print(user_input)

我们刚刚给 REPL 添加了持久的命令历史。现在,我们可以使用上/下箭头来浏览命令历史,并使用Ctrl-R来搜索命令历史。它满足了命令行的基本准则。

自动推荐

在第一篇教程中,我讲到的一个可发现性技巧是自动推荐历史命令。(我是首先在 fish shell 中看到的这一特性)让我们把这一特性加入到我们的 REPL 中:

from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistorywhile 1:   user_input = prompt('>',                       history=FileHistory('history.txt'),                       auto_suggest=AutoSuggestFromHistory(),                      )   print(user_input)

我们只需要给prompt() API 调用添加一个新的参数。现在,我们有了一个具有fish shell风格的 REPL,它可以自动推荐历史命令。

自动补全

现在,让我们通过自动补全来加强 Tab 补全。它能够在用户开始输入的时候弹出可能的命令推荐。

REPL 如何来进行推荐呢?我们使用一个字典来进行可能项的推荐。

比如说我们实现一个针对 SQL 的 REPL 。我们可以把 SQL 关键字存到自动补全字典里面。让我们看一看这是如何实现的:

from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistoryfrom prompt_toolkit.contrib.completers import WordCompleterSQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'],                            ignore_case=True)while 1:   user_input = prompt('SQL>',                       history=FileHistory('history.txt'),                       auto_suggest=AutoSuggestFromHistory(),                       completer=SQLCompleter,                       )   print(user_input)

再次说明,我们只是简单的使用了 prompt-toolkit 内建的一个叫做 WordCompleter 的补全特性,它能够把用户输入和可能推荐的字典进行匹配,然后提供一个列表。

现在,我们有了一个能够自动补全、fish shell 风格的历史命令推荐以及上/下浏览历史的 REPL 。实现这些特性只用了不到 10 行的实际代码。

Click

Click是一个命令行创建工具包,使用它能够更容易的为程序解析命令行选项的参数和常量。在这儿我们不讨论如何使用Click来作为参数解析器。相反,我们将会看看Click带有的一些功能。

安装Click:

pip install click

分页器是 Unix 系统上的实用工具,它们能够一次一页地显示很长的输出。分页器的一些例子包括less、more、most等。通过分页器来显示一个命令的输出不仅仅是一个友好的设计,同时也是必要的。

让我们进一步改进前面的例子。我们不再使用默认print()语句,取而代之的是click.echo_via_pager()。它将会把输出通过分页器发送到标准输出。这是平台无关的,因此在 Unix 系统或 Windows 系统上均能工作。如果必要的话,click_via_pager 会尝试使用一个合适的默认分页器来输出,从而能够显示代码高亮。

from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistoryfrom prompt_toolkit.contrib.completers import WordCompleterimport clickSQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'],                            ignore_case=True)while 1:   user_input = prompt(u'SQL>',                       history=FileHistory('history.txt'),                       auto_suggest=AutoSuggestFromHistory(),                       completer=SQLCompleter,                       )   click.echo_via_pager(user_input)

编辑器

在我前面的文章中一个值得一提的细节是,当命令过于复杂的时候进入编辑器来编辑。Click 有一个简单的 API 能够打开编辑器,然后把在编辑器中输入的文本返回给应用。

import clickmessage = click.edit()
Fuzzy Finder

Fuzzy Finder 是一种通过少量输入来为用户减少推荐的方法。幸运的是,有一个库可以实现 Fuzzy Finder 。让我们首先安装这个库:

pip install fuzzyfinder

Fuzzy Finder的 API 很简单。用户向它传递部分字符串和一系列可能的选择,然后,Fuzzy Finder将会返回一个与部分字符串匹配的列表,这一列表是通过模糊算法根据相关性排序得出的。比如:

>>> from fuzzyfinder import fuzzyfinder>>> suggestions = fuzzyfinder('abc', ['abcd', 'defabca', 'aagbec', 'xyz', 'qux'])>>> list(suggestions)['abcd', 'defabca', 'aagbec']

现在我们有了fuzzyfinder>,让我们把它加入到我们的 SQL REPL 中。方法是我们自定义一个completer而不是使用来自prompt-toolkit库的WordCompleter。比如:

from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistoryfrom prompt_toolkit.completion import Completer, Completionimport clickfrom fuzzyfinder import fuzzyfinderSQLKeywords = ['select', 'from', 'insert', 'update', 'delete', 'drop']class SQLCompleter(Completer):   def get_completions(self, document, complete_event):       word_before_cursor = document.get_word_before_cursor(WORD=True)       matches = fuzzyfinder(word_before_cursor, SQLKeywords)       for m in matches:           yield Completion(m, start_position=-len(word_before_cursor))while 1:   user_input = prompt(u'SQL>',                       history=FileHistory('history.txt'),                       auto_suggest=AutoSuggestFromHistory(),                       completer=SQLCompleter(),                       )   click.echo_via_pager(user_input)
Pygments

现在,让我们给用户输入添加语法高亮。我们正在搭建一个 SQL REPL,如果具有彩色高亮的 SQL 语句,这会很棒。

Pygments是一个提供语法高亮的库,内建支持超过 300 种语言。添加语法高亮能够使应用变得彩色化,从而能够帮助用户在执行程序前发现 SQL 中存在的错误,比如拼写错误、引号不匹配或括号不匹配。

首先,安装Pygments:

pip install pygments

让我们使用Pygments来为 SQL REPL 添加颜色:

from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistoryfrom prompt_toolkit.completion import Completer, Completionimport clickfrom fuzzyfinder import fuzzyfinderfrom pygments.lexers.sql import SqlLexerSQLKeywords = ['select', 'from', 'insert', 'update', 'delete', 'drop']class SQLCompleter(Completer):   def get_completions(self, document, complete_event):       word_before_cursor = document.get_word_before_cursor(WORD=True)       matches = fuzzyfinder(word_before_cursor, SQLKeywords)       for m in matches:           yield Completion(m, start_position=-len(word_before_cursor))while 1:   user_input = prompt(u'SQL>',                       history=FileHistory('history.txt'),                       auto_suggest=AutoSuggestFromHistory(),                       completer=SQLCompleter(),                       lexer=SqlLexer,                       )   click.echo_via_pager(user_input)

Prompt Toolkit能够和Pygments一同很好的工作。我们把Pygments提供的SqlLexer加入到来自prompt-toolkit的prompt中。现在,所有的用户输入都会被当作 SQL 语句,并进行适当着色。

关于“Python怎么快速构建命令行用户界面”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python怎么快速构建命令行用户界面

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么快速构建命令行用户界面

这篇文章主要介绍“Python怎么快速构建命令行用户界面”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么快速构建命令行用户界面”文章能帮助大家解决问题。Python Prompt To
2023-06-27

Python中怎么创建一个命令行界面

这篇文章将为大家详细讲解有关Python中怎么创建一个命令行界面,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通过创建命令行界面(CLI),可以使程序功能强大并具有交互性。CLI允许您接受命
2023-06-16

使用Golang快速构建出命令行应用程序

在日常开发中,大家对命令行工具(CLI)想必特别熟悉了,如果说你不知道命令工具,那你可能是个假开发。每天都会使用大量的命令行工具,例如最常用的Git、Go、Docker等,这篇文章主要介绍了使用Golang快速构建出命令行应用程序,需要的朋友可以参考下
2023-02-24

SCA命令行工具怎样快速构建FaaS服务

这期内容当中小编将会给大家带来有关SCA命令行工具怎样快速构建FaaS服务,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Serverless 架构(无服务器架构),是云计算时代一种全新的、革命性的架构模式
2023-06-05

如何使用Golang快速构建出命令行应用程序

这篇文章主要介绍了如何使用Golang快速构建出命令行应用程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Golang快速构建出命令行应用程序文章都会有所收获,下面我们一起来看看吧。urfave/cl
2023-07-05

mysql命令行怎么创建用户

要在MySQL命令行中创建用户,可以使用以下步骤:打开MySQL命令行客户端。输入以下命令来创建用户:CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';其中,'usern
mysql命令行怎么创建用户
2024-04-09

ASP.NET Core命令行界面CLI怎么使用

这篇文章主要介绍“ASP.NET Core命令行界面CLI怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core命令行界面CLI怎么使用”文章能帮助大家解决问题。CLI (C
2023-06-29

怎么在Linux上使用VirtualBox命令行管理界面

这篇文章将为大家详细讲解有关怎么在Linux上使用VirtualBox命令行管理界面,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。准备工作在开始使用 VBoxManage 的命令行工具前,确
2023-06-12

Linux图形化界面下怎么使用命令进行截图

本篇内容介绍了“Linux图形化界面下怎么使用命令进行截图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!以前在LINUX里面截图都是直接按p
2023-06-12

C#怎么通过System.CommandLine快速生成支持命令行的应用程序

这篇文章主要介绍了C#怎么通过System.CommandLine快速生成支持命令行的应用程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么通过System.CommandLine快速生成支持命令行的应
2023-07-02

Linux系统中怎么使用Node.js构建根据询问创建文件的命令行工具

这篇文章主要介绍了Linux系统中怎么使用Node.js构建根据询问创建文件的命令行工具的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux系统中怎么使用Node.js构建根据询问创建文件的命令行工具文章都
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录