问题描述
Def dostuff():
# do stuff 1
GPIO.add_event_detect(button,…,callback=Interrupt,…)
# do stuff 2
Def Interrupt():
# other stuff
当我运行 dostuff() 时,它执行第 1 项操作,注册中断,然后执行第 2 项操作。当我在执行操作 2 期间按下按钮时,中断被调用,然后返回到 dostuff() 中断处.
我的问题是当我从中断返回时,我希望它在 dostuff() 中调用 return True 从而提前离开函数调用。基本上充当 do stuff 2 的中止开关,因为它需要很长时间。
我尝试在中断中引发异常并在 dostuff() 中放置一个 try catch,但显然引发异常不会返回给调用者。
添加全局变量并不是一个真正的选择,除非我想在 dostuff() 的每一行之后做一个检查。
让中断调用代码的不同部分来改变执行是可行的,但如果我优雅地结束,它最终会返回到令人讨厌和不干净的中断调用者。
有什么想法吗?
解决方法
实现此目的的一种方法是将 do stuff 2
变成单独的进程并终止 Interrupt
中的进程:
>>> process = subprocess.Popen("sleep 3 && echo end",shell=True)
>>> end
process = subprocess.Popen("sleep 3 && echo end",shell=True)
>>> process.kill()
>>> # No end here
您应该在通过以下方式创建流程时准备回调:
def createKiller(process):
return lambda: process.kill()
并给出回调,如:
process = subprocess.Popen(["python","do_stuff_2.py"] + your_args,stdout=subprocess.PIPE)
GPIO.add_event_detect(button,…,callback=createKiller(process),…)
然后您等待结果为:
>>> while process.poll() is None:
... time.sleep(1)
... print('waiting...')
...
waiting...
waiting...
waiting...
>>> process.communicate()
(b'end\n',None)