已經提到的Ctrl+\
通過終端軟件解釋,關鍵綁定是通過stty
配置。除非你有一些定製你的終端軟件的方法,否則你只能使用已經內置的少量信號。
根據你需要多少功能或需要多遠,另一個選擇是編寫你自己的簡單的「流程執行終端」。這將是一個爲您執行應用程序並將您的終端置於原始模式的腳本,以便它可以處理執行自定義操作的擊鍵。
下面是一個過於簡單的例子,顯示我的意思。如果你喜歡,你也可以通過curses或urwid做類似的事情。
要處理過程輸出你需要捕獲的stdout/stderr
並很好地顯示它到屏幕上,使用如果要手動操縱終端,或使用urwid插件來顯示在滾動窗口的輸出等。同樣的想法也會擴展到其他GUI系統(wx,tkinter等),但提到了終端控制。
這裏是term.py
它實現了一個基本原料終端解釋:
import os, signal, subprocess, sys, tty, termios
sigmap = {
'\x15': signal.SIGUSR1, # ctrl-u
'\x1c': signal.SIGQUIT, # ctrl-\
'\x08': signal.SIGHUP, # ctrl-h
'\x09': signal.SIGINT, # ctrl-i
}
# setup tty
fd = sys.stdin.fileno()
old_tc = termios.tcgetattr(fd)
tty.setraw(fd)
# spawn command as a child proc
cmd = sys.argv[1:]
proc = subprocess.Popen(cmd)
while 1:
try:
ch = sys.stdin.read(1)
# example of ansi escape to move cursor down and to column 0
print '\033[1Eyou entered', repr(ch)
if ch == 'q':
break
signum = sigmap.get(ch)
if signum:
os.kill(proc.pid, signum)
finally:
pass
termios.tcsetattr(fd, termios.TCSANOW, old_tc)
sys.exit()
下面是一個簡單target.py
腳本旋轉並打印接收到的信號:
import signal, sys, time
def handler(num, _):
print 'got:', sigmap.get(num, '<other>')
if num == signal.SIGINT:
sys.exit(1)
return 1
signames = ['SIGINT','SIGHUP','SIGQUIT','SIGUSR1']
sigmap = dict((getattr(signal, k), k) for k in signames)
for name in signames:
signal.signal(getattr(signal, name), handler)
while 1:
time.sleep(1)
用例:
% python term.py python target.py
you entered 'h'
you entered 'i'
you entered '\x1c'
got: SIGQUIT
you entered '\x15'
got: SIGUSR1
you entered '\x08'
got: SIGHUP
you entered '\t'
got: SIGINT
you entered 'q'
'2'總是如此。 – delnan 2011-03-29 16:06:32
在哪個平臺上?在Windows上支持信號丟失大量的信號... – 2011-03-29 18:37:33
它的標記,Linux操作系統。 – Nix 2011-03-29 20:19:57