PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商
Posted
技术标签:
【中文标题】PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商【英文标题】:PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider 【发布时间】:2021-12-14 23:21:59 【问题描述】:我正在编写一个简单的函数,它使用 Asyncioscheduler 根据计划发送消息。
scheduler = AsyncIOScheduler()
scheduler.add_job(job, "cron", day_of_week="mon-fri", hour = "16")
scheduler.start()
它似乎有效,但我总是收到以下消息:
PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider. For more details on how to do so, see https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html
PytzUsageWarning: The localize method is no longer necessary, as this time zone supports the fold attribute (PEP 495)
我根本不熟悉 python 中的时间,所以我不确定这条消息要求我做什么。我访问了消息中提供的链接,但那里的解释对我来说太复杂了。据我了解,我必须迁移到使用 PEP495,但我究竟该怎么做呢?
【问题讨论】:
【参考方案1】:要在 APScheduler 中设置 PIP495 兼容时区,请在实例化调度程序时设置参数:
scheduler = AsyncIOScheduler(timezone="Europe/Berlin")
scheduler.add_job(job, "cron", day_of_week="mon-fri", hour = "16")
scheduler.start()
使用flask-APScheduler
(版本1.12.2),将时区添加到配置类中:
"""Basic Flask Example from flask-apscheduler examples, file jobs.py"""
from flask import Flask
from flask_apscheduler import APScheduler
class Config:
"""App configuration."""
JOBS = [
"id": "job1",
"func": "jobs:job1",
"args": (1, 2),
"trigger": "interval",
"seconds": 10,
]
SCHEDULER_API_ENABLED = True
SCHEDULER_TIMEZONE = "Europe/Berlin" # <========== add here
def job1(var_one, var_two):
print(str(var_one) + " " + str(var_two))
if __name__ == "__main__":
app = Flask(__name__)
app.config.from_object(Config())
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()
app.run()
【讨论】:
对我来说,我需要将timezone
添加到 IntervalTrigger,而不是调度程序(我正在使用 BackgroundScheduler)以使警告静音
非常感谢。使用 pyrogram 和作品 :)
没问题,我删掉之前的
@Sergo055,如果答案解决了你的问题,请接受,所以它被关闭了。【参考方案2】:
目前,您无法有效抑制这些警告,因为问题来自apscheduler
本身。
在您的特定情况下,警告来自here
if obj.zone == 'local':
问题是pytz
被认为已弃用,取而代之的是zoneinfo
模块及其后向端口。因此,即使您按照之前的建议直接设置 timezone
参数,您也可能会面临来自其他地方的相同警告,直到 apsheduler
修复现代 Python 版本的 pytz
用法。
但实际上,您可以做一些事情,但我不确定您是否可以接受这种修复。
PytzUsageWarning
来自pytz_deprecation_shim
包,它是tzlocal
的依赖包。 tzlocal
与pytz
深度集成。由于apscheduler
对tzlocal
的依赖相对宽松,您可以安装相当旧的版本,它没有这样的警告,但对于apsscheduler
本身仍然可以接受。
pip install tzlocal==2.1
但是,请注意它可能会破坏其他项目的依赖关系,所以要小心。
【讨论】:
非常感谢!实际上,在启动调度程序时设置时区参数后,警告确实被抑制了。【参考方案3】:由于该区域,我收到了相同的警告消息。
我所做的是:
import tzlocal
scheduler = AsyncIOScheduler(timezone=str(tzlocal.get_localzone()))
使用该本地时区,我不再收到警告消息并且它运行正常。
【讨论】:
以上是关于PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商的主要内容,如果未能解决你的问题,请参考以下文章
Oracle Database 12c Attribute Cluster 和 Zone Map 高阶实验