2016-03-22 2 views
0

Я пытаюсь сравнить два раза с точностью до секунды, но я нахожу несколько раз, когда код вычисляет по-другому, и мое сравнение не работает, и цикл выполняется бесконечно. Я вставил свой код ниже, для справкиСравнение длительности времени Python

start_time = datetimenow() #datetimenow is a function which returns time w/o microseconds    
end_time = start_time + timedelta(seconds = GrabDuration) 
while datetimenow() != end_time: #this part fails sometimes and passes sometimes 
    time.sleep(Grabtime) 
    saveas(imggrab()) 

Если у вас есть какой-либо другой лучший способ сравнения времени и продолжительность времени я был бы признателен, если вы могли бы поделиться. GrabDuration & Grabtime - это заданная пользователем переменная для продолжительности.

ответ

0
import datetime 
import time 
start_time = datetime.datetime.now() 
end_time = start_time + datetime.timedelta(seconds = GrabDuration) 
while start_time != end_time: 
    time.sleep(Grabtime) 

, если у вас есть сравнение между временем начала и окончания времени, то это время цикла кода будет выполняться бесконечное число раз, только если start_time не равна END_TIME

Однако код, который вы поделились, в том, что while вы снова используете текущее системное время и не используете переменную strat_time для вашего сравнения. Пожалуйста, проверьте это.

Вы также можете использовать datetime.datetime.now() метод time() также как datetime.datetime.now(). Time() < datetime.time (час = 2, минута = 10, второй = 10) , Это может помочь вам решить ваши проблемы.

+0

спасибо, у вашего фрагмента была такая же проблема, вот распечатка сравнения. Вы можете видеть, что время пропускает от секунды до 3 секунд, даже если пользовательский ввод для Grabtime составлял 2 секунды. 2016-03-23 ​​15:49:50 = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:49:53 # пропускается до 3 сек = 2016-03-23 ​​15: 49:52 2016-03-23 ​​15:49:55 # Хорошо = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:49:57 # Хорошо = 2016-03-23 15:49:52 2016-03-23 ​​15:49:59 # Хорошо = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:50:02 # Bad = 2016-03 -23 15:49:52 2016-03-23 ​​15:50:04 #GOod = 20 16-03-23 ​​15:49:52 2016-03-23 ​​15:50:06 # Хороший = 2016-03-23 ​​15:49:52 – tensingd1

1

Я предполагаю, что datetimenow возвращается стандартный datetime.datetime объект, поэтому в основном это так:

from datetime import datetime 

def datetimenow(): 
    return datetime.now() 

Сравнение datetime объектов с == или != делает его немного сложнее, потому что это занимает небольшое количество времени для них не равны.

Как тест просто попробовать эти строки в Python РЕПЛ (предполагается, что строки выше введены, так что функция datetimenow() доступна по телефону:

datetimenow() == datetimenow() 

И это вполне возможно, среди многочисленных попыток вас добьется несколько False результатов

Я хотел бы предложить, чтобы сравнить datetime объектов с более безопасными операторами сравнения, что-то вроде этого:.

while datetimenow() <= end_time: 
    time.sleep(Grabtime) 
    saveas(imggrab()) 
+0

Спасибо, да, функция datetimenow() возвращает стандартное datetime. datetime. Его цикл While, который становится сложным, я хочу, чтобы цикл выполнялся до тех пор, пока время не станет равным. Но то, что я нашел, - это sceneio, это не правда все время, хотя end_time получен из datetimenow() плюс значение пользователя. Петля работает так, как я предназначен для некоторых прогонов, но иногда она выполняется до бесконечности. В основном все, что я хочу, чтобы цикл выполнялся до тех пор, пока это время не будет равным времени, указанному пользователем, и оно должно быть точным для секунд. – tensingd1

+0

Это обычное требование для запуска процесса, но убедитесь, что он не займет больше определенного времени. Использование '<=' оператора для сравнения времени вместо '==' отвечает на такое требование. Но на самом деле у нас нет контроля над временем (пока, P). Мне непонятно, как вы хотите обрабатывать именно определенное количество времени, особенно если обработка содержит IO. При работе со значениями времени безопаснее не использовать точные сравнения. – farzad

+0

Эй, Фарзад, я нашел решение. Его функция sleep() иногда выдает неправильные времена. Вместо пассивного счетчика времени или функции ожидания, такого как sleep(), если мы заменим на активный цикл while, который ждет каждую требуемую секунду, мы получим функцию ожидания, которая будет давать вам точное время каждый раз. – tensingd1