我有一个 Azure 函数应用,其中我需要在几个 python 函数中使用当前的日期时间(-3 小时)。
为了确保每个函数都使用相同的时间,我在函数定义之前全局生成datetime对象,并在函数中使用它。
from datetime import datetime, timedelta
import pytz
# get the current time in the correct timezone. Since triggers are executed based on UTC, we then again subtract
# 3 hours (just to be save) to end up with the correct day
current_time = datetime.now(tz=pytz.timezone('Europe/Berlin'))
current_time -= timedelta(days=(3 / 24))
def _file_exists() -> bool:
filename = current_time.strftime('%Y-%m-%d.csv')
# ... further code
def main():
save_as = '{path}/{filename}'.format(path=path_raw, filename=filename)
# ... further code
我不需要修改它的内容,所以不需 global
关键字。
然而,当我把这个函数发布到 azure (Python 3.8, Linux)时,它解析了这个脚本,并在其中设置了 current_time
变量为上传的日期时间,并且在随后的所有执行过程中固定不变(timerTrigger)。例如,我昨天上传了我的函数,此后命令 logging.warning(current_time)
在 main()
产出 2020-04-14 08:31:05.003618+02:00
.
如果我在本地尝试这个功能 (Python 3.7, Windows, PyCharm),即使我手动字节编译文件,也能正常工作。
python test.py # 2020-04-15 11:30:36.426750+02:00
python test.py # 2020-04-15 11:31:00.439632+02:00
python -m compileall .
python __pycache__/test.pyc # 2020-04-15 11:33:27.189967+02:00
python __pycache__/test.pyc # 2020-04-15 11:33:36.853601+02:00
这是在azure上的一个错误吗?或者最好的解决方法是什么?它是否与(im)mutable类型有关,如果是,有谁能提供一个链接来解释这种情况(我知道类函数参数的行为)?
我想把它全局定义为 None
,并将该值设置在一个 _init()
脚本中的函数,在脚本的某个地方被调用。
编辑。 经过几次不成功的尝试,我发现
# get the current time in the correct timezone. Since triggers are executed based on UTC, we then again subtract
# 3 hours (just to be save) to end up with the correct day
current_time = None
def _init_current_time():
global current_time
current_time = datetime.now(tz=pytz.timezone('Europe/Berlin')) - timedelta(days=(3 / 24))
def main():
_init_current_time()
# main code
做的工作。到目前为止,我 可以 工作中,它只是感觉很... 脏。所以,继续这个问题,有没有一个 妥当 解决办法?
有一个类似的问题,使用一个 Python定时器触发的Azure函数.
I 使用一个全局变量来保存时间戳。 这将被用来创建我上传的blob的文件夹结构,例如。/year/month/day/hour
.
I 注意到初始调用后,值保持不变。 的意思是,如果函数在第二天被触发,全局时间戳似乎仍然保持相同的值。注意到这一点是因为函数将文件写入了错误的blobstorage文件夹。
对我来说 看起来这些全局变量只被初始化一次,然后就永远存在了。. 因此,Azure 函数运行时从未真正 "关闭 "和重启过。__init__.py
它只是触发了主功能。
之前我使用HTTP触发器,然后我没有这个问题。因此,在我的情况下,这似乎只是计时器触发的Azure函数的一个问题。
也许对Azure Runtime有更深入了解的人可以更详细地解释这种行为,以及为什么会发生这种情况?