1

我在 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 对象(来自线程模块)进行了一些回调。代码中没有退出调用,因此代码没有理由不继续到下一行。此外,与此非常相似的函数在代码之前的某个时间点运行得很好。

我不知道我还能如何调试代码。非常感谢任何帮助,我很乐意提供任何其他信息。

编辑(当我回答评论时):

  1. 睡眠在顶部正确导入,在此函数运行之前有睡眠调用正确执行。

  2. 因为它是在评论中要求的,所以这是 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:

  1. 我尝试了评论中推荐的一些东西:在 sleep 之前注释掉 self.setLevelCallbacks() 行,仍然退出
  2. 每次打印后使用 sys.stdout.flush()
  3. 用 htop 检查并没有发现异常行为
  4. 在睡眠前打印一行并显示。
4

2 回答 2

0

可能你应该检查你的剩余代码,你在哪里使用你的定时器,如果它们正确等待线程执行提到的代码。

如果此 try 子句未捕获异常,则线程可能被其父级终止或停止。此外,如果父进程在此线程之前完成,它不会给线程时间干净地完成。这是多线程应用程序的常见问题,以及使用 ie kill -9 从终端终止的应用程序。

于 2022-01-18T11:42:57.707 回答
-1

那不是你睡觉的方式,你需要导入时间模块。

import time

time.sleep(0.8) # Sleep for 8 seconds

关于python睡眠

关于睡眠的 Python 文档

您还可以使用 python异步 I/O

于 2022-01-17T17:05:45.337 回答