Python在if语句中的time.mktime条件未按预期执行
我有一个小脚本,打算用它在指定的时间(“commandTime”)执行一个系统命令,然后在指定的时间后退出(“stopTime”)。但是,当我运行这个脚本时,它经常不会执行“if”语句里的命令(有时候会执行,有时候又不会)。
假设我不是个完全的傻瓜(这点还有待验证……),并且我设置的时间变量是合理的,那么当'time.mktime(time.localtime())'的值等于或大于格式化后的'commandTime'变量时,脚本应该会执行if语句里的打印命令。
以下是相关代码的摘录:
import time
commandTime = time.strptime('2013-03-01 05:00:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-01 05:10:00', "%Y-%m-%d %H:%M:%S")
while (time.mktime(time.localtime()) <= time.mktime(stopTime)):
if (time.mktime(time.localtime()) >= time.mktime(commandTime)):
print "Green team go"
time.sleep(100)
假设stopTime和commandTime变量的设置是这样的,当你执行脚本时,以下条件成立:time.localtime() < commandTime < stopTime
那么脚本应该会在while语句中循环,直到time.localtime()的值大于或等于stopTime,每次循环都会检查if条件。一旦time.localtime()大于或等于commandTime,打印命令就应该执行。
我使用time.mktime()将日期时间对象转换为Unix时间(我想是个浮点数),以便在while循环和if语句中进行比较。
while循环每次都能可靠地工作,只有if语句大多数时候不执行。
我在Debian Squeeze 32位上运行的是python 2.7.3。
我的问题是:我在这个脚本中做错了什么,导致if语句在条件满足时不执行?
谢谢!
3 个回答
原来代码本身没问题,问题出在“睡眠”语句里设定的时间长度,以及命令和停止变量之间的时间间隔。
比如说,我把“睡眠”时间设定为100秒,但命令和停止之间的时间差却少于100秒,这样就可能在某次循环中没能触发命令(因为还没到时间),然后等了100秒(在命令时间里“睡觉”),接着就直接退出循环,因为我们已经达到了或超过了停止变量的值。
谢谢大家的帮助!!
注意:如果我的声望高一些,我会给Austin的回答加个赞,因为是他的更简洁的循环逻辑让我找到了真正的问题。
这段代码看起来基本没问题。不过要注意,调用 time.localtime()
的时候,在 while
循环和 if
语句中得到的结果可能会不一样。如果在你的实际代码中,if
和 while
之间有一些耗时的任务,而开始和结束的时间又很接近,那么就可能出现这样的情况:while
循环可以通过,但在 if
执行之前,时间已经过去得足够多,导致测试失败。
你可以把代码改成下面这样。这种写法会先把当前时间存起来(叫 nowSec
),这样在每次循环时就不用重复进行耗时的时间转换了。
import time
commandTime = time.strptime('2013-03-01 05:00:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-01 05:10:00', "%Y-%m-%d %H:%M:%S")
commandTimeSec = time.mktime(commandTime)
stopTimeSec = time.mktime(stopTime)
while True:
nowSec = time.mktime(time.localtime())
if nowSec > stopTimeSec:
break
if nowSec >= commandTimeSec:
print "Green team go"
time.sleep(100)
你现在的设置让这个条件成立:命令时间(commandTime)小于等于当前时间(time.localtime()),而当前时间又小于等于停止时间(stopTime)。
如果你想要的顺序是当前时间小于命令时间,再小于停止时间(localtime < commandTime < stopTime),你需要做以下调整:
import time
commandTime = time.strptime('2013-03-05 21:40:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-05 21:50:00', "%Y-%m-%d %H:%M:%S")
while (time.mktime(time.localtime()) <= time.mktime(stopTime)):
if (time.mktime(time.localtime()) <= time.mktime(commandTime)):
print ("Green team go")
time.sleep(100)
如果你只是写错了想要执行的顺序,其实想要的是命令时间小于等于当前时间小于等于停止时间(commandTime <= time.localtime() <= stopTime),我在Windows上用Python 3.2试过这个方法(把打印改成了函数,插入了我的本地时间),结果是可以的,只要命令时间和停止时间的变量设置正确,所以这可能和Python 2.7或Debian Squeeze有关。
import time
commandTime = time.strptime('2013-03-05 21:40:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-05 21:50:00', "%Y-%m-%d %H:%M:%S")
while (time.mktime(time.localtime()) <= time.mktime(stopTime)):
if (time.mktime(time.localtime()) >= time.mktime(commandTime)):
print ("Green team go")
time.sleep(100)