Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一个while循环中连续检查小时?_Python_Loops_If Statement_While Loop - Fatal编程技术网

Python 如何在一个while循环中连续检查小时?

Python 如何在一个while循环中连续检查小时?,python,loops,if-statement,while-loop,Python,Loops,If Statement,While Loop,这是我在Python中的第一篇文章和第一个项目。我试图通过多种条件控制硬件传感器: 如果传感器感应到移动,发送电子邮件并休眠 如果时间范围不在工作时间之间,则睡到上午9点 否则睡眠半秒钟,等待传感器 到目前为止,第一个条件和最后一个条件都有效。也就是说,如果没有移动,重复睡眠(0.5),直到传感器激活 问题:我在时间不在9-5之间的中间部分遇到问题。如果我在9点之前或5点之后运行代码,它会按照预期一直休眠到9点,但如果代码已经在9-5点之间运行(等待移动),则中间条件不会触发。它会在睡眠时卡住(

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

  • 如果传感器感应到移动,发送电子邮件并休眠
  • 如果时间范围不在工作时间之间,则睡到上午9点
  • 否则睡眠半秒钟,等待传感器
  • 到目前为止,第一个条件和最后一个条件都有效。也就是说,如果没有移动,重复睡眠(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"
    
    def pir_init():
    尽管如此:
    m=datetime.datetime.now().time().minute#循环当前时间
    h=datetime.datetime.now().time().hour
    如果h<9:
    打印(“睡眠…”)
    睡眠时间=(9小时)*3600
    时间睡眠(时间睡眠)
    elif h>16:
    打印(“睡眠…”)
    睡眠时间=(24小时)+9)*3600
    时间睡眠(时间睡眠)
    elif io.输入(pir_引脚):
    打印(“PIR报警”)
    发送电子邮件
    时间。睡眠(10)#冷却以防止电子邮件喷出
    其他:
    打印“等待…”
    时间。睡眠(0.5)#睡眠并等待运动
    打印m
    打印“循环结束”
    #主要
    如果时间元素[0]>'0'和时间元素[0]<'6':#工作日
    如果获取小时数>8且获取小时数<17:#小时范围
    pir_init()
    elif get_hour>16:
    打印(“上午9点初始化…”)
    睡眠时间=(24小时)+9)*3600
    时间睡眠(时间睡眠)
    pir_init()#启动传感器
    elif get_小时<9:
    打印(“上午9点初始化…”)
    睡眠时间=(9小时)*3600
    时间睡眠(时间睡眠)
    pir_init()
    其他:
    #待完成
    打印时间元素[0]
    打印“坏工作日”
    
    您必须更新while循环中的time\u元素,以便程序使用条件中的当前时间来测试是否应睡眠到上午9点。否则,如果不更新while循环中的time_元素,如果程序第一次没有进入该条件,它将永远不会进入


    这就解释了你所注意到的行为;事实上,这里没有显示您对时间元素的定义…

    您的代码示例有很多缩进问题,我只是指出了这一点,因为您说过这是您的第一个Python项目,所以我想给你一个机会,在人们提供实际逻辑帮助之前,先清理一下你的格式。你也可以通过将
    从datetime导入datetime
    添加到顶部和
    datetime.now().time().hour
    来获取当前小时作为int,我假设这是基于这个设备和代码?是的,它是基于运动检测器的例子。我不知道你可以得到一个整数小时,所以我将不得不相应地调整我的代码,谢谢@这是我检索小时的解决方案:
    now=datetime.datetime.now()strtime=now.strftime(“%w%H%M”)time\u elements=strtime.split()time\u sleep=int((24-int(time\u elements[1])+9)*3600
    ,这听起来是实现这一点的正确方法。我的理解正确吗?时间应该传递给函数pir_init(current_time)?不,不应该将其作为参数传递,因为必须在循环中获取当前时间,并在每次迭代中更新它。您可以这样做:导入datetime:import datetime,然后在循环中执行:date=datetime.datetime.now()。。。elif date.hour17:time.sleep(time\u sleep)感谢您的澄清。我希望时间被传递和更新的原因是,当程序最初启动时,它应该以与while循环相同的方式休眠或激活传感器。我想我必须在循环内外重复使用相同的时间公式。