Python在if语句中的time.mktime条件未按预期执行

2 投票
3 回答
572 浏览
提问于 2025-04-17 18:05

我有一个小脚本,打算用它在指定的时间(“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 个回答

0

原来代码本身没问题,问题出在“睡眠”语句里设定的时间长度,以及命令和停止变量之间的时间间隔。

比如说,我把“睡眠”时间设定为100秒,但命令和停止之间的时间差却少于100秒,这样就可能在某次循环中没能触发命令(因为还没到时间),然后等了100秒(在命令时间里“睡觉”),接着就直接退出循环,因为我们已经达到了或超过了停止变量的值。

谢谢大家的帮助!!

注意:如果我的声望高一些,我会给Austin的回答加个赞,因为是他的更简洁的循环逻辑让我找到了真正的问题。

0

这段代码看起来基本没问题。不过要注意,调用 time.localtime() 的时候,在 while 循环和 if 语句中得到的结果可能会不一样。如果在你的实际代码中,ifwhile 之间有一些耗时的任务,而开始和结束的时间又很接近,那么就可能出现这样的情况: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)
0

你现在的设置让这个条件成立:命令时间(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)

撰写回答