程序:从文件' config.txt'获取下一个检查时间,如果当前时间与下一个检查时间相同或更长,则程序应进入一个恒定循环, :
检查某些内容,执行操作,然后将下一个检查时间记录到文件中,然后等待下一个检查时间相同或更大,然后重复。
问题: 函数之外的变量在被调用时保持不变。请参阅变量:msg_time,其中显示在函数
中时间不会更改的时间名为config.txt的文件包含:
nextchecktime='2016, 03, 09, 10, 38, 27, 508749'
时间格式为%Y,%m,%d,%H,%M,%S,%f,以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:09
块引用
我还有许多其他变量,我也试图在函数内进行更改和调用,但是在调用时它们都显示原始值(为了简单起见,我将它们从代码中删除,因为解决了msg_time问题应该解决所有问题)
我认为问题可能与不退出该功能有关,但我不确定该怎么做。
这是我的第一个节目,如果难以阅读,很抱歉,任何提示都将受到赞赏!
答案 0 :(得分:0)
任何引用msg_time
作为global
的函数都需要告知它应该使用全局版本而不是创建本地版本。在每个函数中,通常在顶部,您应该添加:
global msg_time
将来任何用途都将访问/修改全局变量。
请注意这一行:
msg_time = datetime.datetime.now().strftime('%H:%M %d-%M-%y : ')
不会让msg_time
不断更新,您需要在每次需要时调用它来保持当前时间的最新状态。