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.
我正在尝试 运行 一个带有 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.