0

我已经用谷歌搜索了很多,我只能找到与循环中的条件相关的答案。我希望这个循环无限运行(因此当 1==1 时),我现在正在测试它,只是让它在 Thonny 中运行。它运行可变的时间长度,然后停止。它不会退出程序或停止运行,它只是表现得好像在等待某些东西,但我看不到它在等待什么。shell 不报告任何错误或报告它已停止运行,它只是停止打印第四行打印语句中的字符串。

我对 python 和 Linux 很陌生,我不知道如何调试这个问题或在哪里寻找停止点。即使在调试模式下运行它也不会呈现任何有用的信息。请问有人有什么建议吗?

除了我所说的之外,我尝试过的唯一另一件事是我尝试在三台不同的 Raspberry Pi 4 Model B 计算机上全新安装的 Raspberry Pi OS 上运行它。它在所有这些上的行为完全相同。

while 1==1:
  time.sleep(1)
  cnt = 1
  print('One = One loop ' + str(datetime.today()) + ' CNT: ' + str(cnt))
   while Decimal(target_temperature()) - Decimal(0.3) >= Decimal(actual_temperature()) and switch_state() == 'currently not running':
    print('Before heating loop ' + str(datetime.today()))
    try:
        if cnt == 1:
            if Decimal(target_temperature()) - Decimal(0.3) >= Decimal(actual_temperature()) and switch_state() == 'currently not running':
                print('First heating loop ' + str(datetime.today()))
                requests.get('http://192.168.1.167/4/on')
                log_db('On', str(target_temperature()), str(actual_temperature()))
                time.sleep(225)
                requests.get('http://192.168.1.167/4/off')
                log_db('Off', str(target_temperature()), str(actual_temperature()))
                time.sleep(300)
                cnt = cnt + 1
        if(cnt != 1):
            if Decimal(target_temperature()) - Decimal(0.3) >= Decimal(actual_temperature()) and switch_state() == 'currently not running':
                print('Second heating loop ' + str(datetime.today()))
                requests.get('http://192.168.1.167/4/on')
                log_db('On', str(target_temperature()), str(actual_temperature()))
                time.sleep(180)
                requests.get('http://192.168.1.167/4/off')
                log_db('Off', str(target_temperature()), str(actual_temperature()))
                time.sleep(300)
    except Exception as e:
        print(e) 
4

2 回答 2

1

请记住,我对python一无所知,我会尽力提供帮助。

1 - 我要做的第一件事是将整个程序放在一个 try catch 块中。如果发生任何不好的事情,你应该被告知

try:
   <all your code>
except Exception as e2:
        print('The whole thing errored' + e2)

2 - 延迟以秒为单位?对于测试,我会将每次睡眠更改为(30),这样您就可以看到发生了什么而不会太无聊地等待,当您让它工作时,然后将时间改回来。

3 - 我会添加更多 print('got here!') 就像你有 if(cnt == 1) add else print('first loop wasnt 1 it was ' + cnt)

4 - 尝试使代码更易于阅读,当它实际运行时,它将被优化到与您编写的内容没有任何关系。因此,以对您来说最简单的方式编写它

5 - 你打开它然后关闭它,但如果关闭失败它永远不会被关闭,你应该假设它会变得很糟糕,那将是你收到一大笔账单的那一天。如果发生错误,请尝试通过添加另一个检查来停止它,如果 actualTemp > targetTemp 然后将其关闭?

6 - http 请求可能需要很长时间,以秒为单位指定您准备等待的时间,例如,timeout=60

try:
  while 1==1:
    try:
      time.sleep(30)
  
      targetTemp = Decimal(target_temperature())
      actualTemp = Decimal(actual_temperature())
      switchState = switch_state() 

      print('Doing it at ' + str(datetime.now()) + ' target ' + str(targetTemp) + ' actual ' + str(actualTemp) + ' switch ' + switchState)

      if targetTemp - Decimal(0.3) >= actualTemp and switchState == 'currently not running'
        print('too cold turning it for a bit!')
        requests.get('http://192.168.1.167/4/on', timeout=60)
        log_db('On', targetTemp , actualTemp)
      else if actualTemp > targetTemp and switchState != 'currently not running'
        print('too hot turning it off!')
        requests.get('http://192.168.1.167/4/off', timeout=60)
        log_db('Off', targetTemp , actualTemp)
      else
        print('Not doing anything!')
    except Exception as e1:
      print('Loop errored -> ' + e1)     
except Exception as e2:
  print('Whole thing errored -> ' + e2) 
于 2020-12-12T18:53:51.190 回答
0

谢谢比利小子。你是对的。有时循环通过 HTTPRequests 使用的设备只是不响应(这两个函数使用 HTTPRequests),有时它们会创建未在循环中捕获的错误。奇怪的是,将整个事情放在 try/catch 中确实识别出这一点。问题解决了。

于 2020-12-20T18:40:28.727 回答