Nix*_*Nix 10 python linux signals
我目前需要为程序提供多个键盘中断.使用信号类有一个简单的方法吗?我目前使用SIGINT/ Ctrl+C但我找不到任何其他键盘映射.
拥有超过2个信号会很高兴.如何定义更多信号或者是否有更好的方法来捕获"用户中断"?
这是当前代码的高级视图:
def shutdown(signal, frame):
if(signal==2): #sigint
print 'do something'
elif signal==XX:
print 'do something else'
# continued...
signal.signal(signal.SIGINT, shutdown)
signal.signal(signal.SOMEOTHERTYPE, shutdown)
print 'start'
t = Thread(target=run)
t.setDaemon(True)
t.start()
print 'Done, press ctrl c, or ctrl ? '
signal.pause()
Run Code Online (Sandbox Code Playgroud)
sam*_*ias 11
在Ctrl+\已经提到的由终端软件解释,并且键绑定配置为通过stty.除非您有一些自定义终端软件的方法,否则您只能使用已经内置的少量信号.
根据您需要的功能或您想要的功能,另一个选择是编写您自己的简单"流程执行终端".这将是一个脚本,为您执行应用程序并将您的终端置于原始模式,以便它可以处理执行自定义操作的击键.
下面是一个简单的例子,显示了我的意思.如果你愿意,你也可以通过curses或urwid做类似的事情.
要处理进程输出,您需要捕获stdout/stderr并将其显示在屏幕上,如果您手动操作终端,则使用ANSI转义序列,或使用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()
Run Code Online (Sandbox Code Playgroud)
这是一个简单的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)
Run Code Online (Sandbox Code Playgroud)
用法示例:
% 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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4425 次 |
| 最近记录: |