Python не выполняется при условии time.mktime в операторе if

У меня есть небольшой скрипт, который я собирался использовать, чтобы выполнить системную команду в указанное время ("commandTime"), а затем выйти через указанное время ("stopTime"). Однако, когда я запускаю сценарий, он чаще всего никогда не выполнит команду с помощью оператора "if". (Это иногда выполняется, а иногда нет.)

Предполагая, что я не полный идиот (присяжные все еще не согласны с этим...) и устанавливаю временные переменные разумно, сценарий должен выполнить команду печати внутри оператора if, когда '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 не может выполняться большую часть времени.

Я использую Py thon 2.7.3 на Debian Squeeze 32-bit.

У меня такой вопрос: что я делаю неправильно в этом сценарии, из-за которого оператор if не выполняется при выполнении условия?

Спасибо!

3 ответа

Код, размещенный в целом, выглядит нормально. Обратите внимание, что вызов time.localtime() вернет разные результаты для while а также if петли. Если в вашем реальном коде между iе и 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

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, я попробовал этот способ в python 3.2 для Windows (изменил печать на функцию с моим локальным временем вставки) и он работает с правильно установленными переменными 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)

Оказывается, код был в порядке, проблема была связана с продолжительностью времени, указанной в операторе sleep, в сочетании с тем, насколько близко (по времени) были переменные command и stop.

Если я установил режим сна на 100 секунд, но затем установил разницу во времени между командой и остановкой менее чем на 100 секунд, можно было не запускать команду на итерации (потому что еще не было времени), подождать 100 секунд ("спящий режим"). "через время команды), а затем немедленно выходить из цикла, потому что мы достигли или превысили нашу переменную остановки.

Спасибо за помощь!!

ПРИМЕЧАНИЕ. Если бы у меня была достаточно высокая репутация, я бы получил +1 ответ Остина, так как это была его логика более чистого цикла, которую я использовал, чтобы набрать номер по актуальной проблеме.

Другие вопросы по тегам