【发布时间】:2016-12-07 10:43:11
【问题描述】:
我有一个无限循环,其中有一些操作必须在退出循环之前完全执行。也就是说,我正在使用套接字库连接到外部设备,我需要等待读取指令完成才能中断循环。
我尝试使用信号处理程序(如this question)在检测到键盘中断时引发标志。
当前代码:
import videosensor
import signal
def signal_handler(signal, frame):
"""Raises a flag when a keyboard interrupt is raised."""
global interrupted
interrupted = True
if __name__ == '__main__':
camera = videosensor.VideoSensor(filename)
interrupted = False
signal.signal(signal.SIGINT, signal_handler)
while not interrupted:
location = camera.get_register()
#...
#More irrelevant stuff is executed.
#...
time.sleep(0.01)
#This code has to be executed after exiting while loop
camera_shutdown(camera)
在前面的代码中,videosensor.VideoSensor 是一个包含用于从外部设备获取数据的套接字操作的类。主程序中使用的get_register()方法如下:
def get_register(self):
"""Read the content of the specified register.
"""
#Do some stuff
value = socket.recv(2048)
return value
问题:
我希望 while 循环持续执行,直到用户按下一个键或使用键盘中断,但在当前迭代完成之后。相反,使用之前的解决方案不能正常工作,因为它会中断正在进行的指令,并且如果它正在读取套接字,则会引发错误:
/home/.../client.pyc 在 read_register(self, regkey) 中
164 reg = self._REGISTERS[regkey] 165 self.send('r,{}\n'.format(reg)) --> 166 value = socket.recv(2048) 167 #Convert the string input into a valid value e.g. list or int 168 formatted_result = ast.literal_eval(value)错误:[Errno 4] 系统中断
编辑:从下面的答案看来,没有办法使用 键盘中断 并避免套接字读取功能被中止。尽管有捕捉错误的解决方案,但它们并不能避免读取取消。
不过,我有兴趣找到一种获取用户输入的方法,例如特定的按键,会引发标志,将在循环结束时进行检查,在此检查之前不会中断主程序的执行。
EDIT2:使用的操作系统是Linux发行版Ubuntu 14.04
【问题讨论】:
-
@zmo 我编辑了内容,说明了为什么该解决方案不适合。无论如何,谢谢你的提议。
-
您在什么平台上运行您的代码 - Windows 或 Unix?
-
@mhawke 我使用的是 Unix,即 Ubuntu 14.04
-
@Jalo:好的,看看我的回答,看看它是否适合你。