Python 全局变量在循环函数中调用时不会更改



Program:要从文件'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问题应该解决所有问题)

我认为问题可能与不退出函数有关,但我不确定该怎么做。

这是我的第一个程序,很抱歉,如果它难以阅读,任何提示将不胜感激!

任何

引用msg_time作为global的函数都需要被告知它应该使用全局版本而不是创建本地版本。在每个函数中,通常在顶部,您应该添加:

global msg_time

然后,任何将来的使用都将访问/修改全局变量。

请注意,此行:

msg_time = datetime.datetime.now().strftime('%H:%M %d-%M-%y : ')

不会持续更新msg_time,您需要在每次需要时调用它以保持当前时间最新。

相关内容

  • 没有找到相关文章

最新更新