【问题标题】:How can I continuously check the hour within a while loop?如何在 while 循环中连续检查小时?
【发布时间】:2013-04-10 20:03:12
【问题描述】:

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

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

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

问题:我在时间不在 9 点到 5 点之间的中间部分遇到问题。如果我在 9 点之前或 5 点之后运行代码,它会一直休眠到上午 9 点按预期到达,但如果代码已经在 9 点到 5 点之间运行(等待移动),则中间条件永远不会触发。它卡在睡眠状态(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"

【问题讨论】:

  • 你的代码示例有很多缩进问题,我只是指出这是因为你说这是你的第一个 Python 项目,所以我想给你一个机会来清理你的在人们提供实际逻辑帮助之前进行格式化
  • 您还可以通过在顶部添加 from datetime import datetimedatetime.now().time().hour 来获取当前小时作为 int
  • 我假设这是基于此设备和代码? learn.adafruit.com/…
  • 是的,它基于那个运动检测器示例。我不知道你可以将小时作为一个整数,所以我必须相应地调整我的代码,谢谢。 @siluaty这是我检索小时的解决方案:now = datetime.datetime.now() strtime = now.strftime("%w %H %M") time_elements = strtime.split() time_sleep = int((24 - int(time_elements[1])) + 9) * 3600

标签: python loops if-statement while-loop


【解决方案1】:

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

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

【讨论】:

  • 这听起来像是完成此任务的正确方法。我是否正确理解应该将时间传递给函数 pir_init(current_time)?
  • 不,您不应该将它作为参数传递,因为您必须在循环中获取当前时间并在每次迭代中更新它。您可以导入日期时间:导入日期时间,然后在循环内:日期=日期时间.日期时间.now() ... elif date.hour17: time.sleep(time_sleep)
  • 感谢您的澄清。我希望传递和更新时间的原因是,当程序最初启动时,它应该以与 while 循环相同的方式休眠或激活传感器。我想我必须在循环内外重复使用相同的时间公式。
猜你喜欢
  • 2015-12-15
  • 2016-02-24
  • 1970-01-01
  • 2011-09-09
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多