0

所以现在我有两个功能:

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() 中的每一行之后进行检查。

将中断调用到代码的不同部分以更改执行是可行的,但是如果我优雅地结束,它最终会返回给令人讨厌且不干净的中断调用者。

有任何想法吗?

4

1 回答 1

0

实现此目的的一种方法是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)
于 2021-07-05T19:47:10.310 回答