2

我有一个小脚本,用于在指定时间(“commandTime”)执行系统命令,然后在指定时间退出(“stopTime”)。但是,当我运行脚本时,它往往永远不会执行“if”语句下的命令。(它有时会执行,有时不会。)

假设我不是一个彻头彻尾的白痴(陪审团仍然没有解决......)并且正在合理地设置时间变量,脚本应该在'time.mktime(time.localtime())时执行if语句中的打印命令' 等于或大于格式化的 'commandTime' 变量。


以下是相关代码的摘录:

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() 将 datetime 对象转换为 Unix 时间(我认为是浮点数),以便在 while 循环和 if 语句中进行比较。

while 循环每次都可靠地工作,只有 if 语句在大多数情况下无法执行。

我在 Debian Squeeze 32 位上运行 python 2.7.3。

我的问题是:我在这个脚本中做错了什么导致 if 语句在满足条件时不执行?

谢谢!

4

3 回答 3

0

一般发布的代码看起来没问题。请注意,调用将针对and循环time.localtime()返回不同的结果。如果在您的真实代码中,您在f 和之间有一些长时间运行的任务,并且开始/停止时间很接近,那么您很可能会遇到掉线的情况,但在执行时间移动到足够远之前测试失败。whileifiwhilewhileif

您可以重写为以下内容。这会缓存当前时间以进行比较 ( 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)
于 2013-03-06T03:32:04.790 回答
0

结果证明代码很好,问题与睡眠语句中指定的时间长度以及命令和停止变量的接近程度(及时)有关。

如果我将 sleep 设置为 100 秒,然后将 command 和 stop 之间的时间差设置为小于 100 秒,则可能不会在迭代中触发命令(因为它还不是时间),等待 100 秒(“睡眠" 通过命令时间),然后立即退出循环,因为我们已经达到或超过了我们的停止变量。

谢谢您的帮助!!

注意:如果我有足够高的声誉,我会 +1 奥斯汀的回答,因为这是我用来解决实际问题的更清晰的循环逻辑。

于 2013-03-06T20:45:08.750 回答
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 中尝试了这种方式(将打印更改为函数,插入了我的本地时间)它适用于正确设置的 commandTime 和 stopTime 变量,因此它必须与 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)
于 2013-03-06T02:47:27.323 回答