Python 如何在一个while循环中连续检查小时?
这是我在Python中的第一篇文章和第一个项目。我试图通过多种条件控制硬件传感器: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点之间运行(等待移动),则中间条件不会触发。它会在睡眠时卡住(
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循环相同的方式休眠或激活传感器。我想我必须在循环内外重复使用相同的时间公式。