【问题标题】:Python not executing on time.mktime condition in if statementPython 未在 if 语句中按 time.mktime 条件执行
【发布时间】:2013-03-06 02:25:18
【问题描述】:

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

假设我不是一个彻头彻尾的白痴(陪审团仍然在这个问题上......)并且正在合理地设置时间变量,脚本应该在 if 语句中执行 print 命令时 'time.mktime(time.localtime ())' 等于或大于格式化的 '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()

脚本应该循环遍历 while 语句,直到 time.localtime() 等于或大于 stopTime,检查每个循环的 if 条件。一旦 time.localtime() 大于或等于 commandTime,就应该执行打印命令。

我正在使用 time.mktime() 将 datetime 对象转换为 Unix 时间(我认为是浮点数),以便在 while 循环和 if 语句中进行比较。

while 循环每次都能可靠地工作,只有 if 语句大部分时间执行失败。

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

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

谢谢!

【问题讨论】:

    标签: python if-statement time conditional-statements mktime


    【解决方案1】:

    您当前的设置方式使以下内容成为现实: commandTime

    如果您希望它成为您所说的方式(本地时间

    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

    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)
    

    【讨论】:

    • 我刚刚在 Windows 上的 2.7.3 中尝试过这个,它也有效(我放了第二次代码中断)。还要确保为命令时间设置正确的日期(即 2013-05-03)
    • 你说得对,诺兰,我粘贴的代码是正确的,但是我输入的比较不正确。您的比较是正确的: commandTime
    【解决方案2】:

    一般发布的代码看起来没问题。请注意,调用time.localtime() 将为whileif 循环返回不同的结果。如果在您的真实代码中,您在 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)
    

    【讨论】:

    • 感谢 Austin,在 if 和 while 之间并没有发生很多事情,但我肯定会在早上测试您建议的格式,看看它是否表现不同。
    【解决方案3】:

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

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

    感谢您的帮助!

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

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多