gpt4 book ai didi

Python:内置键盘信号/中断

转载 作者:IT王子 更新时间:2023-10-29 00:05:01 28 4
gpt4 key购买 nike

我目前需要为一个程序提供多个键盘中断。有没有一种简单的方法可以用信号类来做到这一点?我目前使用 SIGINT/Ctrl+C 但找不到任何其他键盘映射。

最好有 2 个以上的信号。如何定义更多信号或是否有更好的方法来捕获“来自用户的中断”?

这是当前代码的高级 View :

 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+\是由你的终端软件解释的,键绑定(bind)是通过stty配置的。除非您有一些自定义终端软件的方法,否则您将只能使用已经内置的少数信号。

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

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

要处理进程输出,您需要使用 ANSI escape sequences 捕获 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'

关于Python:内置键盘信号/中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475456/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com