cdzjf 发表于 2022-8-8 15:55:59

这样的报错信息如何捕获啊

apscheduler中的信息,这种信息如何才能捕获到呢?尝试了好几种异常和警告的方式都不行

z5560636 发表于 2022-8-8 16:15:25

自己写一个啊,判断输入的字符,异常就直接 raise 一个异常

hrpzcf 发表于 2022-8-8 16:21:41

这不是报错,这是你使用的模块的log信息。

cdzjf 发表于 2022-8-8 18:29:18

z5560636 发表于 2022-8-8 16:15
自己写一个啊,判断输入的字符,异常就直接 raise 一个异常

就是捕获不到这一行,只能看到打印出来,没有办法用其他方式获取

cdzjf 发表于 2022-8-8 18:29:50

hrpzcf 发表于 2022-8-8 16:21
这不是报错,这是你使用的模块的log信息。

怎么捕获?就是定时任务的错误信息

suchocolate 发表于 2022-8-9 07:44:43

发代码啊

hrpzcf 发表于 2022-8-9 09:16:12

cdzjf 发表于 2022-8-8 18:29
怎么捕获?就是定时任务的错误信息

捕获?你是想像捕获异常一样吗?恐怕不行。
不过可以把它的输出重定向到某个流然后读取它打印的内容。

dolly_yos2 发表于 2022-8-9 12:58:22

看了一下这个库的文档,应该是提供了一个 add_listener 方法可以来注册特定事件触发的回调函数,同时事件列表里也有 EVENT_JOB_MISSED ,可能和这个日志的输出有关。您可以尝试注册对应的监听器来捕获信息,具体的还是要根据您的需求和实现参照文档。

cdzjf 发表于 2022-8-9 14:48:30

hrpzcf 发表于 2022-8-9 09:16
捕获?你是想像捕获异常一样吗?恐怕不行。
不过可以把它的输出重定向到某个流然后读取它打印的内容。

这个怎么做呢?

cdzjf 发表于 2022-8-9 14:49:00

suchocolate 发表于 2022-8-9 07:44
发代码啊

apscheduler,设置一个已经过去的时间就会出现这个

hrpzcf 发表于 2022-8-9 15:17:20

本帖最后由 hrpzcf 于 2022-8-9 15:19 编辑

cdzjf 发表于 2022-8-9 14:48
这个怎么做呢?

import io
from contextlib import redirect_stdout, redirect_stderr

f = io.StringIO()
# with redirect_stderr(f):
# 或下面这个,用哪个由log往标准输出流还是标准错误流输出决定
with redirect_stdout(f):
    pass
    # 写任何引发输出的代码

print(f.getvalue())

cdzjf 发表于 2022-8-9 20:27:29

hrpzcf 发表于 2022-8-9 15:17


请帮忙看看这个代码

from apscheduler.schedulers.blocking import BlockingScheduler
def abc():
    pass

scheduler = BlockingScheduler(timezone='Asia/Shanghai')
scheduler.add_job(func=abc, trigger='date', run_date='2022-08-07 22:03:03')
scheduler.start()

执行这个就会打印
Run time of job "abc (trigger: date, next run at: 2022-08-07 22:03:03 CST)" was missed by 1 day, 22:23:09.748884

我就是想捕获这段警告,用你的方法应该怎么做呢?

hrpzcf 发表于 2022-8-10 19:04:26

cdzjf 发表于 2022-8-9 20:27
请帮忙看看这个代码

from apscheduler.schedulers.blocking import BlockingScheduler


我试了,scheduler.start()是阻塞性方法,运行后会一直阻塞在这个方法中,用我的那个办法不能在scheduler.start()结束前获取内容。也许你需要把程序打包为exe,然后用subprocess模块运行exe来获取它输出的内容。或者你需封装一个TextIOWrapper,然后把程序的输出流重定向到你封装的TextIOWrapper上(不确定是否有用)

阿奇_o 发表于 2022-8-10 19:48:19

八楼dolly 说的应该是正确的方向。。

cdzjf 发表于 2022-8-10 23:46:48

hrpzcf 发表于 2022-8-10 19:04
我试了,scheduler.start()是阻塞性方法,运行后会一直阻塞在这个方法中,用我的那个办法不能在scheduler ...

这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python这个到度算什么?不是警告吗?那还为啥不能捕获到?

hrpzcf 发表于 2022-8-10 23:49:19

cdzjf 发表于 2022-8-10 23:46
这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python ...

前面不是说了吗,这是aps啥的模块的log,日志。它是往标准错误流输出的。

hrpzcf 发表于 2022-8-11 23:28:38

cdzjf 发表于 2022-8-10 23:46
这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python ...

用多线程捕获内容
import io
import sys
import threading
import time
from contextlib import redirect_stderr

from apscheduler.schedulers.blocking import BlockingScheduler

stringio = io.StringIO()

sys.stderr = stringio


def abc():
    pass


def listen():
    while True:
      val = stringio.getvalue()
      if val:
            print("捕获:", val)
            stringio.__init__()
      else:
            print("没有捕获内容")
      time.sleep(1)


thread = threading.Thread(target=listen)
thread.setDaemon(True)
thread.start()


scheduler = BlockingScheduler(timezone="Asia/Shanghai")
scheduler.add_job(func=abc, trigger="date", run_date="2022-08-07 22:03:03")

with redirect_stderr(stringio):
    scheduler.start()

cdzjf 发表于 2022-8-13 16:32:41

hrpzcf 发表于 2022-8-11 23:28
用多线程捕获内容

确实是可以,但我想知道
stringio.getvalue()这个具体是做什么的呢

hrpzcf 发表于 2022-8-13 17:10:35

cdzjf 发表于 2022-8-13 16:32
确实是可以,但我想知道
stringio.getvalue()这个具体是做什么的呢

stringio.getvalue()是获取重定向到stringio中的文本。
代码中sys.stderr = stringio这句是多余的,忘记删了
页: [1]
查看完整版本: 这样的报错信息如何捕获啊