Программа: чтобы получить следующее время проверки из файла 'config.txt', если текущее время такое же или больше времени, как в следующее время проверки, тогда программа должна введите постоянный цикл:Python Глобальные переменные, не изменяющиеся при вызове внутри зацикленной функции
проверка чего-то, выполнение действия, а затем запись следующего контрольного времени в файл, затем ожидание следующего контрольного времени будет таким же или большим, а затем повторить.
Задача: Переменные вне функций остаются неизменными при вызове. См Variable: msg_time, который отображает время, не изменяется в то время как в функции
имени файла config.txt содержит:
nextchecktime='2016, 03, 09, 10, 38, 27, 508749'
Формат времени% Y,% м,% d,% Н ,% M% S,% е во времени UTC
Код:
import datetime, time, re
msg_time = datetime.datetime.now().strftime('%H:%M %d-%M-%y : ') # Date format prefix at the start of each message to user.
#Get last time program run from config file
config_file = open('config.txt', 'r+')
config_data = config_file.read()
config_file.close()
next_check_time_regex = re.compile(r'nextchecktime\=\'((.)*)\'') # Find nextchecktime= line in config file
mo = next_check_time_regex.search(config_data)
next_check_time = datetime.datetime.strptime(mo.group(1), '%Y, %m, %d, %H, %M, %S, %f') #phrasing date plain text from config file to next_check_time as a datetime format (UTC time - same time as sever time)
nz_time = next_check_time + datetime.timedelta(hours=13) #converting from UTC time to GMT + 13 (same time as myself)
def time_break(): #breaks until new_check_time == time now
while datetime.datetime.utcnow() <= new_check_time:
time.sleep(1)
# Search for new feedbacks
def check_new_feedback():
global new_check_time
print(msg_time + 'Checking.')
new_check_time = datetime.datetime.utcnow() + datetime.timedelta(minutes= 1) #update new_check_time to next time to check
### Checking feedback code in here (removed) ###
config_file = open('config.txt', 'r+')
config_data = config_file.read()
mo = next_check_time_regex.sub(r"nextchecktime='" + str(new_check_time.strftime('%Y, %m, %d, %H, %M, %S, %f')) + "'", config_data)
config_file.seek(0) # Back to line 0 in file
config_file.write(mo) # writing new_check_time to file so when program closes can remember last check time.
print(msg_time + 'Completed check and written time to file, next check time = ', new_check_time.strftime('%H:%M'))
config_file.close() # close config file
time_break()
check_new_feedback()
#Starting program here to get into a loop
print('starting \n')
if datetime.datetime.utcnow() <= next_check_time:
print(msg_time + 'Waiting till %s for next for next check.' % next_check_time.strftime('%H:%M'))
while datetime.datetime.utcnow() <= next_check_time:
time.sleep(1)
check_new_feedback()
else:
check_new_feedback()
пытаюсь получить msg_time для отображения фактического времени как на момент сообщения.
Текущий результат:
начиная
00:06 10-06-16: Ожидание до 11:07 на следующий для следующей проверки.
00:06 10-06-16: Проверка.
00:06 10-06-16: Завершена проверка и время записи в файл, следующее время проверки = 11:08
00:06 10-06-16: Проверка.
00:06 10-06-16: Завершена проверка и написано время в файл, в следующий раз проверить = 11:09
Результат Требуются:
начиная
00 : 06 10-06-16: Ожидание до 11:07 для следующего для Следующая проверка.
00:07 10-06-16: Проверка.
00:07 10-06-16: Завершена проверка и написано время в файл, в следующий раз проверить = 11:08
00:08 10-06-16: Проверка.
00:08 10-06-16: Завершена проверка и написано время в файл, в следующий раз проверить = 11:09Blockquote
У меня есть ряд других переменных, я тоже пытаясь изменить и вызвать внутри функции, но все они показывают исходное значение при вызове (я просто удалил их из кода, так как решение проблемы с msg_time должно решить все)
Я думаю, что проблема может быть делать это не выходя из функции, но Я не знаю, как это сделать.
Это моя первая программа, так что извините, если ее трудно прочитать, любые советы будут оценены!
Только при письме на него. –
Спасибо, я только что проверил, добавив это, но это не решило проблему, проблема в том, что я вызываю глобальную переменную msg_time, но она использует исходное время с первого вызова, она не обновляет ее с фактическим временем, когда вызов снова выполняется в функции. –
Я не вижу никакого кода, на самом деле говорящего 'msg_time' для обновления, он устанавливается один раз в вашей третьей строке и никогда больше. 'datetime.now' не обновляется постоянно, он просто устанавливает вашу переменную' msg_time' один раз, когда ее вызывают –