Python APScheduler 失败:'Only timezones from the pytz library are supported' 错误

Python APScheduler fails: 'Only timezones from the pytz library are supported' error

我正在尝试 运行 一个带有 asyncioscheduler 计划作业的 python 异步应用程序,但是 APScheduler 在构建过程中由于这个错误而失败:

'Only timezones from the pytz library are supported' error

我确实在我的应用程序中包含了 pytz,并且我正在传递时区。是什么导致了错误?

我在创建作业管理器的 class 中调用异步调度程序:

from apscheduler.schedulers.asyncio import AsyncIOScheduler


class ScheduleManager:
    def __init__(self) -> None:
    self.scheduler = AsyncIOScheduler()
    
    def start(self):
    self.scheduler.start()

    def stop(self):
    self.scheduler.shutdown()
    
    def add_seconds_interval_job(self, callback, interval : int):
    self.scheduler.add_job(callback, 'interval', seconds = interval)
    
    def add_minutes_interval_job(self, callback, interval : int):
    self.scheduler.add_job(callback, 'interval', minutes = interval)

    def add_hours_interval_job(self, callback, interval : int):
    self.scheduler.add_job(callback, 'interval', hours = interval)

    def add_days_interval_job(self, callback, interval : int):
    self.scheduler.add_job(callback, 'interval', days = interval)

然后我从我的应用程序中调用此经理,例如:

from jobs import ScheduleManager, ConfigJob

class AppInitializer:

    def __init__(self) -> None:
    self.schedule_manager = ScheduleManager()
    self.config__job = ConfigJob()

    async def initialize(self, app, loop):
    self.schedule_manager.add_seconds_interval_job(self.config_job.run, 5)
    self.schedule_manager.start()

好的,所以它需要一个依赖项 tzlocal==2.1,这样它才能获得本地时区,我假设出于某种原因,该模块的版本在我的系统上不起作用

在 3.0 中,tzlocal 库从 pytz 切换到 zoneinfo 时区,APScheduler 3.x 与这些不兼容。因此,APScheduler 3.7.0 已将 tzlocal 固定到 v2.x。如果您通过 APScheduler 安装 tzlocal 3.0,那么您使用的是旧版本。请升级。

我也偶然发现了这个。现在有一个新的 tzlocal 版本 (4.1) 实际上与 apscheduler 3.x 不兼容,这在固定中没有处理:apscheduler 3.8.1 requires tzlocal!=3.*,>=2.0 如果您安装了 tzlocal==4.1,这会破坏一些东西。我现在手动将 tzlocal 固定在我的 requirements.yml:

tzlocal<3.0 或更具体 tzlocal==2.1

更新: apscheduler 文档声明此问题已在 3.8.1 和 3.9.0 中修复,它们不再强制执行 pytz 时区。在对不同版本进行了一些测试之后,我仍然遇到 Python 3.10.2、apscheduler 3.8.1/3.9.0 和 tzlocal 4.0/4.1 的相同错误。我被迫使用 tzlocal<3.0.