PytzUsageWarning: zone属性是特定于pytz接口的,请迁移到新的时区提供程序

15
我正在编写一个简单的函数,它使用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,但我应该如何做到呢?

4个回答

22
在APScheduler中设置PIQ495兼容时区,只需在实例化调度程序时设置参数:
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()

1
对我来说,我需要将 timezone 添加到 IntervalTrigger 中,而不是调度程序(我正在使用 BackgroundScheduler)以消除警告。 - virgesmith
1
非常感谢。使用Pyrogram并且工作正常 :) - Ahmet Burak
这并不能解决问题,@pavel-sapezhka的答案解决了我们遇到的问题。 - Stefan
@Stefan,我尝试了这段代码,确实解决了问题,至少在我回答时使用的库版本中是这样的。 - Alex Poca
1
@AlexPoca。抱歉,我有一段时间没有查看这个页面了。你的回答确实解决了我的问题。非常感谢! - Sergo055
显示剩余2条评论

6

由于区域的问题,我遇到了相同的警告信息。

我的做法是:

import tzlocal

scheduler = AsyncIOScheduler(timezone=str(tzlocal.get_localzone()))

有了本地时区,我不再收到警告消息,并且它可以正常运行。


3
我刚刚更改为:
if __name__ == '__main__':
scheduler = BlockingScheduler(timezone=pytz.timezone('Asia/Ho_Chi_Minh'))

请确保导入 'pytz'...否则,这将无法正常工作。 - PanDe

3

目前,你无法有效地抑制这些警告,因为问题来自于 apscheduler 本身。

在你的特定情况中,警告来自于这里

if obj.zone == 'local':

问题在于pytz已被认为是过时的,推荐使用zoneinfo模块及其后备。因此,即使您直接设置timezone参数如之前所建议的那样,您可能仍会遇到来自其他地方的相同警告,直到apscheduler修复pytz在现代Python版本中的使用。
但实际上,还是有一些方法可以解决这个问题,但我不确定这种修复方式是否适合您。 PytzUsageWarning来自pytz_deprecation_shim包,它是tzlocal的依赖项。 tzlocalpytz深度集成。由于apschedulertzlocal的依赖性相对较弱,因此您可以安装一个相当旧的版本,该版本没有这样的警告,但对于apsscheduler本身仍然可接受。
pip install tzlocal==2.1

但请注意这可能会破坏其他项目的依赖关系,所以请小心。


非常感谢!实际上,在初始化调度程序时设置时区参数后,警告确实被抑制了。 - Sergo055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接