Rumah >Tutorial sistem >LINUX >Perpustakaan untuk membina antara muka pengguna baris arahan Python berkualiti tinggi

Perpustakaan untuk membina antara muka pengguna baris arahan Python berkualiti tinggi

WBOY
WBOYke hadapan
2024-01-17 11:27:211367semak imbas

Dalam tutorial kedua ini dalam siri dua bahagian tentang program terminal dengan antara muka baris arahan yang hebat, kami akan membincangkan Prompt, Toolkit, Klik, Pygments dan Fuzzy Finder.
如何构建优秀的命令行用户界面的 Python 库

Ini ialah tutorial kedua dalam siri dua bahagian saya tentang program terminal dengan antara muka baris arahan yang hebat. Dalam artikel pertama, kami membincangkan beberapa ciri yang menjadikan aplikasi baris arahan menyeronokkan untuk digunakan. Dalam artikel kedua ini, kita akan melihat cara melaksanakan ciri ini menggunakan beberapa perpustakaan Python.

Saya merancang untuk melaksanakannya dalam kurang daripada 20 baris kod Python. Mari mulakan.

Python Prompt Toolkit

Saya sudah biasa memanggil perpustakaan ini Pisau Tentera Swiss untuk aplikasi baris arahan, ia boleh digunakan sebagai pengganti baris baca, kutukan, dll. Mari kita pasang perpustakaan ini dahulu dan kemudian mulakan tutorial:

pip install prompt_toolkit

Kami bermula dengan REPL yang mudah (Anotasi LCTT: REPL - Gelung Baca-Eval-Cetak, persekitaran pembangunan interaktif). REPL biasa menerima input pengguna, menjalankan operasi dan mengeluarkan hasilnya. Sebagai contoh, dalam contoh kami, kami akan melaksanakan REPL dengan fungsi "gema". Ia hanya mencetak input pengguna seperti:

REPL
from prompt_toolkit import prompt

while 1:
    user_input = prompt('>')
    print(user_input)

Ini semua kod untuk melaksanakan REPL. Ia membaca input pengguna dan kemudian mencetak input pengguna. Fungsi gesaan yang digunakan dalam kod ini datang daripada pustaka prompt_toolkit, yang merupakan pengganti pustaka baris baca.

Sejarah Perintah

Untuk meningkatkan kefungsian REPL kami, kami boleh menambah sejarah arahan:

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory

while 1:
    user_input = prompt('>', 
                        history=FileHistory('history.txt'),
                       )
    print(user_input)

Kami baru sahaja menambah sejarah arahan yang berterusan pada REPL. Sekarang kita boleh menggunakan anak panah atas/bawah untuk menyemak imbas sejarah arahan dan Ctrl-R untuk mencari sejarah arahan. Ia memenuhi garis panduan asas baris arahan.

Pengesyoran automatik

Dalam tutorial pertama, salah satu teknik kebolehtemuan yang saya bincangkan ialah secara automatik mengesyorkan arahan sejarah. (Saya mula-mula melihat ciri ini dalam kulit ikan) Mari tambahkan ciri ini pada REPL kami:

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory

while 1:
    user_input = prompt('>', 
                        history=FileHistory('history.txt'),
                        auto_suggest=AutoSuggestFromHistory(),
                       )
    print(user_input)

Kami hanya perlu menambah parameter baharu pada panggilan API prompt(). Kini kami mempunyai REPL gaya cengkerang ikan yang secara automatik mengesyorkan arahan sejarah.

Autolengkap

Sekarang, mari tingkatkan pelengkapan tab dengan Autolengkap. Ia muncul kemungkinan cadangan arahan apabila pengguna mula menaip.

Bagaimana untuk mengesyorkan REPL? Kami menggunakan kamus untuk mengesyorkan item yang mungkin.

Sebagai contoh, mari kita laksanakan REPL untuk SQL. Kami boleh menyimpan kata kunci SQL dalam kamus autolengkap. Mari lihat cara ini berfungsi:

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.contrib.completers import WordCompleter

SQLCompleter = 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)

Sekali lagi, kami hanya menggunakan ciri penyiapan terbina dalam prompt-toolkit dipanggil WordCompleter, yang memadankan input pengguna dengan kemungkinan kamus yang disyorkan dan menyediakan senarai.

Kini kami mempunyai REPL dengan pelengkapan automatik, cadangan arahan sejarah gaya cangkerang ikan dan sejarah penyemakan imbas atas/bawah. Melaksanakan ciri ini mengambil masa kurang daripada 10 baris kod sebenar.

Klik

Klik ialah kit alat penciptaan baris arahan yang memudahkan untuk menghuraikan parameter dan pemalar pilihan baris arahan untuk program. Kami tidak akan membincangkan cara menggunakan Klik sebagai penghurai parameter di sini. Sebaliknya, kami akan melihat beberapa ciri yang disertakan dengan Click.

Pasang Klik:

pip install click

Penginator ialah alat berguna pada sistem Unix yang mampu memaparkan output yang sangat panjang satu halaman pada satu masa. Beberapa contoh alat kelui termasuk kurang, lebih, kebanyakan, dsb. Memaparkan output arahan melalui alat kelui bukan sahaja reka bentuk yang mesra, tetapi juga satu keperluan.

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

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.contrib.completers import WordCompleter
import click

SQLCompleter = 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 click
message = 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 prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.completion import Completer, Completion
import click
from fuzzyfinder import fuzzyfinder

SQLKeywords = ['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 prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.completion import Completer, Completion
import click
from fuzzyfinder import fuzzyfinder
from pygments.lexers.sql import SqlLexer

SQLKeywords = ['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 语句,并进行适当着色。

结论

我们的“旅途”通过创建一个强大的 REPL 结束,这个 REPL 具有常见的 shell 的全部特性,比如历史命令,键位绑定,用户友好性比如自动补全、模糊查找、分页器支持、编辑器支持和语法高亮。我们仅用少于 20 行 Python 代码就实现了这个 REPL 。

不是很简单吗?现在,你没有理由不会写一个自己的命令行应用了。


Atas ialah kandungan terperinci Perpustakaan untuk membina antara muka pengguna baris arahan Python berkualiti tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:linuxprobe.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Perjalanan penemuan PostgreSQLArtikel seterusnya:Perjalanan penemuan PostgreSQL