为啥调度和请求库不适用于 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 中的不可变属性

为啥等待不适用于节点请求模块?

为啥宽度:100% 不适用于 div display: table-cell?

GET 请求适用于 Postman,但为啥它不适用于 ReactJS fetch?