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:
verwendenkeyboard.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
verwendenUnterprozess 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))