Python:内置键盘信号/中断

我目前需要为一个程序提供多个键盘中断。 有没有一个简单的方法来做到这一点与信号类? 我目前使用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() 

已经提到的Ctrl+\被终端软件解释,并且键绑定是通过stty配置的。 除非您有一些自定义终端软件的方法,否则您只能使用已经内置的少量信号。

根据你需要多少功能或者你想要多少功能,另一个选择是编写你自己的简单的“流程执行终端”。 这将是一个脚本,为您执行一个应用程序,并将您的终端置于原始模式,以便它可以处理执行自定义操作的击键。

下面是一个简单的例子,显示我的意思。 如果你喜欢,你也可以通过curses或urwid做类似的事情。

要处理过程输出,您需要捕获stdout/stderr并很好地显示在屏幕上,如果您手动操作终端,或使用urwid小部件在滚动窗口中显示输出,则使用ANSI转义序列同样的想法也会扩展到其他的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' 

在Linux系统上,Ctrl + \会产生一个信号.SIGQUIT信号。

我不确定是否有预定义的方式来定义新的信号并将它们映射到键盘事件。

如果您需要这种灵活性,您可能必须使用保留在前台的接口线程并监听键盘事件。 然后,它可以以任何你喜欢的方式与其他线程通信。