GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erkennen Sie Tastendrücke auf einem Linux-Terminal im Low-Level-Stil in Python

Standardmäßig ist die Standardeingabe gepuffert und verwendet den kanonischen Modus. Damit können Sie Ihre Eingabe bearbeiten. Wenn Sie die Eingabetaste drücken, kann die Eingabe von Python gelesen werden.

Wenn Sie einen niedrigeren Zugriff auf die Eingabe wünschen, können Sie tty.setraw() verwenden auf dem Standardeingabedateideskriptor. Auf diese Weise können Sie mit sys.stdin.read(1) jeweils ein Zeichen lesen . Beachten Sie, dass in diesem Fall das Python-Skript für die Verarbeitung von Sonderzeichen verantwortlich ist und Sie einige Funktionen wie das Echo und das Löschen von Zeichen verlieren. Weitere Informationen finden Sie unter termios(3).

Über Escape-Sequenzen, die für Auf- und Ab-Tasten verwendet werden, können Sie auf Wikipedia nachlesen.

Sie sollten in der Lage sein, das Standard-Shell-Verhalten zu replizieren, wenn Sie alles in einem Prozess abwickeln.

Sie können auch versuchen, einen Unterprozess zu verwenden (der sich nicht auf das Modul bezieht - Sie können fork() verwenden oder popen() ). Sie würden die ungepufferte Eingabe im Hauptprozess analysieren und an stdin (die gepuffert werden kann) des Unterprozesses senden. Wahrscheinlich benötigen Sie eine Kommunikation zwischen den Prozessen, um den Verlauf mit dem Hauptprozess zu teilen.

Hier ist ein Beispiel für den Code, der benötigt wird, um die Eingabe auf diese Weise zu erfassen. Beachten Sie, dass es nur einige grundlegende Verarbeitungen durchführt und mehr Arbeit benötigt, um Ihrem Anwendungsfall gerecht zu werden.

import sys
import tty
import termios


def getchar():
    fd = sys.stdin.fileno()
    attr = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        return sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSANOW, attr)


EOT = '\x04'  # CTRL+D
ESC = '\x1b'
CSI = '['

line = ''

while True:
    c = getchar()
    if c == EOT:
        print('exit')
        break
    elif c == ESC:
        if getchar() == CSI:
            x = getchar()
            if x == 'A':
                print('UP')
            elif x == 'B':
                print('DOWN')
    elif c == '\r':
        print([line])
        line = ''
    else:
        line += c

Python hat ein Tastaturmodul mit vielen Funktionen. Installieren Sie es, vielleicht mit diesem Befehl:

pip install keyboard

Verwenden Sie es dann in folgendem Code:

import keyboard

keyboard.add_hotkey('up', lambda: keyboard.write('write command retrieved from the history of your shell here'))
keyboard.wait('esc')

oder Sie könnten die Funktion on_press_keyUsing the function on_press_key:

verwenden
keyboard.on_press_key("p", lambda _:print("You pressed p"))

Es braucht eine Callback-Funktion. Ich habe _ verwendet, weil die Tastaturfunktion das Tastaturereignis an diese Funktion zurückgibt.

Nach der Ausführung wird die Funktion ausgeführt, wenn die Taste gedrückt wird. Sie können alle Hooks stoppen, indem Sie diese Zeile ausführen:

keyboard.unhook_all()

Für detaillierte Informationen können Sie einen ähnlichen Beitrag zu Stackoverflow sehen. Hoffen Sie, dass dies hilft, Tastendrücke in Python zu erkennen?

Hinweis auf der Seite: Sie erwähnten die Methode fork() oben. In Python können wir die Methode

verwenden

Unterprozess eingebautes Modul hier, also Unterprozess importieren und los geht's. Insbesondere die Run-Funktion dient hier dazu, Befehle in einer Subshell auszuführen. Für diejenigen, die von C kommen, erspart uns dies das Verzweigen und Erstellen eines untergeordneten Prozesses und das Warten darauf, dass der untergeordnete Prozess die Ausführung beendet. Lassen Sie Python dieses eine Mal das erledigen.

Beispielcode zum Ausführen der vom Benutzer eingegebenen Befehle

def execute_commands(command):
    try:
        subprocess.run(command.split())
    except Exception:
        print("psh: command not found: {}".format(command))

Linux
  1. So installieren Sie Python unter Linux

  2. So installieren Sie Python 3.10 auf Rocky Linux 8

  3. Simulieren des Key Press-Ereignisses mit Python für Linux

  4. So führen Sie eine Python-Datei unter Linux aus

  5. Wie deaktiviere ich eine Tastaturtaste in Linux (Ubuntu)?

So überprüfen Sie den Batteriestatus und -stand des Laptops im Terminal unter Linux

So öffnen Sie ein Linux-Terminalfenster

So erstellen Sie eine SSH-Schlüssel-Passphrase unter Linux

So vergleichen Sie zwei Dateien im Linux-Terminal

So öffnen Sie eine PDF-Datei im Linux-Terminal

So aktivieren Sie den niedrigen Grafikmodus in Ubuntu Linux