Secara default input standar disangga dan menggunakan mode kanonik. Ini memungkinkan Anda untuk mengedit input Anda. Saat Anda menekan tombol enter, masukan dapat dibaca oleh Python.
Jika Anda menginginkan akses tingkat yang lebih rendah ke masukan, Anda dapat menggunakan tty.setraw()
pada deskriptor file input standar. Ini memungkinkan Anda untuk membaca satu karakter pada satu waktu menggunakan sys.stdin.read(1)
. Perhatikan bahwa dalam hal ini skrip Python akan bertanggung jawab untuk menangani karakter khusus, dan Anda akan kehilangan beberapa fungsi seperti pengulangan dan penghapusan karakter. Untuk informasi selengkapnya, lihat termios(3).
Anda dapat membaca tentang escape sequence yang digunakan untuk tombol atas dan bawah di Wikipedia.
Anda harus dapat mereplikasi perilaku shell standar jika Anda menangani semuanya dalam satu proses.
Anda mungkin juga ingin mencoba menggunakan subproses (tidak mengacu pada modul - Anda dapat menggunakan fork()
atau popen()
). Anda akan mem-parsing input tanpa buffer dalam proses utama dan mengirimkannya ke stdin (yang dapat di-buffer) dari subproses. Anda mungkin perlu melakukan komunikasi antar-proses untuk berbagi histori dengan proses utama.
Berikut adalah contoh kode yang diperlukan untuk menangkap masukan dengan cara ini. Perhatikan bahwa ini hanya melakukan beberapa pemrosesan dasar dan membutuhkan lebih banyak pekerjaan agar sesuai dengan kasus penggunaan Anda.
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 memiliki modul keyboard dengan banyak fitur. Instal, mungkin dengan perintah ini:
pip install keyboard
lalu gunakan dalam kode seperti ini:
import keyboard
keyboard.add_hotkey('up', lambda: keyboard.write('write command retrieved from the history of your shell here'))
keyboard.wait('esc')
atau Anda dapat menggunakan fungsi on_press_keyMenggunakan fungsi on_press_key:
keyboard.on_press_key("p", lambda _:print("You pressed p"))
Ini membutuhkan fungsi panggilan balik. Saya menggunakan _ karena fungsi keyboard mengembalikan acara keyboard ke fungsi itu.
Setelah dieksekusi, itu akan menjalankan fungsi ketika tombol ditekan. Anda dapat menghentikan semua pengait dengan menjalankan baris ini:
keyboard.unhook_all()
untuk informasi terperinci Anda dapat melihat posting serupa di stackoverflow, harap ini membantu mendeteksi penekanan tombol di python?
Di samping Catatan: Anda menyebutkan metode fork() di atas Dalam python kita dapat menggunakan
subproses modul bawaan di sini, jadi impor subproses dan kami siap melakukannya. Fungsi run khususnya digunakan di sini untuk mengeksekusi perintah dalam subkulit. Bagi mereka yang berasal dari C, ini menyelamatkan kita dari melakukan forking dan membuat proses anak dan kemudian menunggu anak menyelesaikan eksekusi, biarkan Python yang mengurusnya kali ini.
contoh kode untuk menjalankan perintah yang dimasukkan oleh pengguna
def execute_commands(command):
try:
subprocess.run(command.split())
except Exception:
print("psh: command not found: {}".format(command))