为啥调度和请求库不适用于 Python 中的此类?
Posted
技术标签:
【中文标题】为啥调度和请求库不适用于 Python 中的此类?【英文标题】:Why schedule and requests library don't work with this Class in Python?为什么调度和请求库不适用于 Python 中的此类? 【发布时间】:2020-12-27 18:44:39 【问题描述】:我是一个非常初学者。我有这门课,我想每天在某个时间从网站获取一些数据(这里是每秒一次,因为我正在测试它)。我想使用计划模块,但我不知道是什么问题。我使用 Pycharm,程序运行时没有输出。
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):
r = requests.get(url=self.url, headers=self.headers, params=self.params).json()
return r['data']
schedule.every(5).seconds.do(Bot)
while True:
schedule.run_pending()
time.sleep(1)
我也尝试过这样做:
impactBot = Bot()
schedule.every(5).seconds.do(impactBot())
while True:
schedule.run_pending()
time.sleep(1)
但在这里我得到一个错误,他们说“Bot 对象不可调用”。我做错了什么?
【问题讨论】:
你只是在调用类构造函数。您永远不会调用实际发出请求的方法。 好的,我可以按照其他用户的建议用“schedule...do.(impactBot.fetchCurrenciesData)”来调用它,但程序仍然没有输出运行 如果你想显示输出为什么你不在方法fetchCurrenciesData
中加入打印词干
【参考方案1】:
你需要为初始化对象调用类,然后调用对象类的方法。 按照我的例子解决它:
ClassObj = Bot()
# Call method fetchCurrenciesData
ClassObj.fetchCurrenciesData()
# or
# Singal line
Bot().fetchCurrenciesData()
以下是您的代码示例。
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):
r = requests.get(url=self.url, headers=self.headers, params=self.params).json()
return r['data']
schedule.every(5).seconds.do(Bot().fetchCurrenciesData())
while True:
schedule.run_pending()
time.sleep(1)
【讨论】:
太好了,我也遇到了同样的问题,花了几个小时在谷歌上搜索解决方案,谢谢你拯救了我的一天 :) 谢谢你,但我仍然得到“TypeError:第一个参数必须是可调用的”错误,在我做了你写的之后 在 Pycharm 中,如果有帮助,我也会从计划包文件中收到此错误:/.../site-packages/schedule/__init__.py,第 440 行,在 do self.job_func = functools.部分(job_func,*args,**kwargs) 这应该如何工作?Bot().fetchCurrenciesData()
只会执行一次,result(不能调用)会交给.do
。【参考方案2】:
试试这个:
impactBot = Bot()
schedule.every(5).seconds.do(impactBot.fetchCurrenciesData)
while True:
schedule.run_pending()
time.sleep(1)
schedule....do()
需要一个可调用对象。
【讨论】:
完成,但程序仍在继续运行,没有输出 @User147 为什么期望输出?我没有看到任何对print
的调用会产生一些输出。您是否只想每 5 秒“看到”r["data"]
?然后将print(r["data"])
放入fetchCurrenciesData
方法中(而不是返回它)以上是关于为啥调度和请求库不适用于 Python 中的此类?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 switch_to_window() 方法不适用于 Python 中的 selenium webdriver?
为啥 CORS 适用于 API 请求,但不适用于我的 Nginx 配置中的媒体文件(例如 mp4、webm)?
为啥 Room 实体不适用于 Android 中的不可变属性