python - 如何在 while 循环中连续检查小时数?

标签 python loops if-statement while-loop

这是我在 Python 中的第一篇文章和第一个项目。我正在尝试通过多种条件来控制硬件传感器:

  1. 如果传感器感应到运动,发送电子邮件并 sleep
  2. 如果时间范围不在工作时间之间,则睡到早上 9 点
  3. 否则休眠半秒并等待传感器

到目前为止,第一个条件和最后一个条件都有效。也就是说,如果没有移动,重复 sleep(0.5) 直到传感器激活。

问题:我在处理时间不在 9 点到 5 点之间的中间部分时遇到问题。如果我在 9 点之前或 5 点之后运行代码,它会按预期休眠直到上午 9 点到达,但如果代码已经在 9 点到 5 点之间运行(等待移动),则中间条件永远不会触发。它卡在 sleep 状态(0.5)。

我不是那么有经验,但我有一个模糊的想法,即第二个过程应该有助于跟踪时间。有什么建议么?这是代码。

def pir_init():
    while True:
        m = datetime.datetime.now().time().minute   #loop through for current time
        h = datetime.datetime.now().time().hour     
        if h < 9:                                           
            print("Sleeping...")
            time_sleep = (9 - h) * 3600
            time.sleep(time_sleep)
        elif h > 16:
            print("Sleeping...")
            time_sleep = ((24 - h) + 9) * 3600
            time.sleep(time_sleep)
        elif io.input(pir_pin):
            print("PIR ALARM")
            send_gmail()   
            time.sleep(10)      #cooldown to prevent email spew
        else:
            print "Waiting..."
            time.sleep(0.5)     #sleep and wait for movement
            print m
    print "Loop End"


# main
if time_elements[0] > '0' and time_elements[0] < '6':  #Weekdays
    if get_hour > 8 and get_hour < 17:             #Hour Range
        pir_init()
    elif get_hour > 16:
        print("Initialization at 9am...")
        time_sleep = ((24 - get_hour) + 9) * 3600
        time.sleep(time_sleep)
        pir_init()              #initiate sensor
    elif get_hour < 9:
        print("Initialization at 9am...")
        time_sleep = (9 - get_hour) * 3600
        time.sleep(time_sleep)
        pir_init()
else:
    #to be completed
    print time_elements[0]
    print "bad weekday"

最佳答案

您必须更新 while 循环内的 time_elements,以便程序使用条件中的当前时间来测试它是否应该休眠到上午 9 点。否则,如果你不更新 while 循环内的 time_elements,如果程序第一次没有进入那个条件,它将永远不会进入。

这解释了您注意到的行为;事实上,这里没有显示您对 time_elements 的定义...

关于python - 如何在 while 循环中连续检查小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070546/

相关文章:

python - 导入单词列表,不想在代码中重复一遍

python - 如何将 django 模型字段值作为参数传递给可调用的(同一模型中字段的默认值)?

php - 如何在 Twig 中正确循环三维数组?

php - 循环PHP,按组无重复字段,求和mysql

Ruby gets() 没有返回正确的字符串

c - C中的输入切换

linux - bash 脚本的算术错误

python - 如何 : (1) making a copy of a numpy array, (2) 修改此副本,以及 (3) 返回修改后的副本

python - 在 python、Windows Anaconda 中找不到 Chromedriver

c++ - 在 C++ for 循环中使用除 int 以外的数据类型作为索引值