Python中schedule与requests库无法配合自定义类使用的问题排查
问题分析与解决方案
嘿,我来帮你理清楚这两个写法的问题,以及怎么修正它们!
先看你的两个写法为什么不对
写法一的问题:你把
Bot类直接传给了schedule.do(),schedule每次执行时确实会创建一个Bot实例,但这个操作本身不会触发任何数据获取逻辑——你只是实例化了类,却没有调用fetchCurrenciesData方法!而且实例化类本身不会产生输出,所以程序看起来毫无反应。写法二的问题:
impactBot()是试图调用这个Bot实例,但你的Bot类没有定义__call__方法,Python自然会报错“Bot object is not callable”。更关键的是,schedule.do()需要接收可调用对象(比如函数、类的方法),而你这里传的是impactBot()执行后的返回值(也就是None,因为__init__没有返回值),完全不符合schedule的要求。
正确的写法
你需要把Bot实例的fetchCurrenciesData方法传给schedule.do(),同时别忘了在方法里添加输出逻辑(比如打印数据),不然就算执行了也看不到结果。
修正后的完整代码:
import requests import time import schedule class Bot: def __init__(self): self.url = 'https://www.website.com' self.params = { ... } # 替换成你的实际参数 self.headers = { ... } # 替换成你的实际请求头 self.orders = [] def fetchCurrenciesData(self): try: r = requests.get(url=self.url, headers=self.headers, params=self.params).json() data = r['data'] print("成功获取数据:", data) # 添加打印,才能看到输出 return data except Exception as e: print("获取数据出错:", str(e)) # 加上异常捕获,方便排查问题 # 实例化Bot类 impactBot = Bot() # 将实例的方法传给schedule.do(),注意不要加括号!加括号会直接执行方法而不是传入可调用对象 schedule.every(5).seconds.do(impactBot.fetchCurrenciesData) while True: schedule.run_pending() time.sleep(1)
额外小提示
如果你的fetchCurrenciesData需要传参数,可以用do方法的args或kwargs参数,比如:
schedule.every(5).seconds.do(impactBot.fetchCurrenciesData, param1="value1", param2="value2")
内容的提问来源于stack exchange,提问作者User 147
相关产品推荐
相关产品推荐

