我在 Raspberry Pi 4 中运行 Python 代码,它从某些引脚读取信号并做出相应响应。
在这个函数上,在行间多次打印之后,我将问题缩小到(显然)一个 sleep() 调用。
def on_enter_sanitizing(self):
try:
print('Entered state: Sanitizing')
self.setLevelLedCallbacks() #This function has a print at the end, which shows
sleep(0.8)
print("POST SLEEP") #This print doesn't show
level = self.checkForLevel()
print('Sanitizing with level: '+level)
self.BUTTON_PLAY_OUT.Press()
self.setErrorLedCallbacks()
errors = False
while True:
sleep(0.3)
if self.checkEndCondition():
break
if self.checkForErrors():
errors = True
break
self.cancelLevelCallbacks()
self.cancelErrorLedCallbacks()
if errors:
self.error_mid_san()
else:
print("SANITIZATION OK")
self.sanitizationFinished()
except Exception as e:
print("ERROR")
print(e)
添加了 try/except 块来检查异常,但它不会触发“except”块。有一次,我还在睡觉前添加了一个打印件,这也显示出来了。
终端,除了睡眠之前的任何输出,在退出时什么都不显示,就像任何代码在完成执行时所做的一样。
作为背景,我对某些 Raspberry pin 边缘(使用 pigpio 模块)和在后台运行的某些 Timer 对象(来自线程模块)进行了一些回调。代码中没有退出调用,因此代码没有理由不继续到下一行。此外,与此非常相似的函数在代码之前的某个时间点运行得很好。
我不知道我还能如何调试代码。非常感谢任何帮助,我很乐意提供任何其他信息。
编辑(当我回答评论时):
睡眠在顶部正确导入,在此函数运行之前有睡眠调用正确执行。
因为它是在评论中要求的,所以这是 setLevelCallbacks 的代码:
def setLevelLedCallbacks(self): self.pin_callback(self.PIN_L1,self.LED_L1.asyncRead(),None) self.LED_L1.setCallback(Either=self.pin_callback) self.pin_callback(self.PIN_L2,self.LED_L2.asyncRead(),None) self.LED_L2.setCallback(Either=self.pin_callback) self.pin_callback(self.PIN_L3,self.LED_L3.asyncRead(),None) self.LED_L3.setCallback(Either=self.pin_callback) print("CALLBACK COMPLETE") #This shows
回调在设置之前被调用一次,因为我需要在任何边缘之前的初始值。
编辑2:
- 我尝试了评论中推荐的一些东西:在 sleep 之前注释掉 self.setLevelCallbacks() 行,仍然退出
- 每次打印后使用 sys.stdout.flush()
- 用 htop 检查并没有发现异常行为
- 在睡眠前打印一行并显示。