Чтобы убедиться, что каждая функция использует одно и то же время , я генерирую объект 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
Однако, когда я публикую эту функцию в 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
Связано ли это с (не)изменяемыми типами, и если да, есть ли у кого-нибудь ссылка, объясняющая это для этого случая (мне известно о поведении в параметрах классов/функций)?
Я подумываю о том, чтобы определить его глобально как 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
Подробнее здесь: https://stackoverflow.com/questions/612 ... p-on-azure