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 Если вы просто опечатали способ, которым вы хотите, чтобы он выполнялся, и вы действительно хотите 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)
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 ответ Остина, так как это была его логика более чистого цикла, которую я использовал, чтобы набрать номер по актуальной проблеме.