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

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

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

Сценарий должен циклически выполнять оператор while до тех пор, пока time.localtime() не станет равным или больше, чем stopTime, проверяя условие if в каждом цикле. Когда time.localtime() больше или равно commandTime, должна выполняться команда печати.

Я использую time.mktime() для преобразования объекта datetime во время Unix (я думаю, с плавающей запятой), чтобы выполнить сравнение как в цикле while, так и в операторе if.

Цикл while надежно работает каждый раз, только оператор if не выполняется большую часть времени.

Я использую python 2.7.3 на 32-разрядной версии Debian Squeeze.

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

Спасибо!


person spacestout    schedule 06.03.2013    source источник


Ответы (3)


То, как вы настроили его в настоящее время, делает следующее истинным: commandTime ‹= time.localtime() ‹= 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, я попробовал этот способ в python 3.2 в Windows (изменил print на функцию, с моим местным временем) и он работает с правильно установленными переменными 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)
person Nolan Knill    schedule 06.03.2013
comment
Я только что попробовал это в 2.7.3 в Windows, и это также сработало (второй кодовый перерыв я поставил). Также убедитесь, что вы устанавливаете правильные даты для командного времени (например, 2013-05-03). - person Nolan Knill; 06.03.2013
comment
Вы правы, Нолан, код, который я вставил, верен, но я неправильно ввел сравнение. Ваше сравнение верное: commandTime ‹= time.localtime() ‹= stopTime. - person spacestout; 06.03.2013

Код, опубликованный в целом, выглядит нормально. Обратите внимание, что вызов time.localtime() вернет разные результаты для циклов while и if. Если в вашем реальном коде у вас есть какая-то длительная задача между 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)
person Austin Phillips    schedule 06.03.2013
comment
Спасибо, Остин, между if и while не так много всего происходит, но я обязательно протестирую предложенный вами формат утром, чтобы увидеть, ведет ли он себя по-другому. - person spacestout; 06.03.2013

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

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

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

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

person spacestout    schedule 06.03.2013