Почему библиотека расписания и запросов не работает с этим классом в Python?

Я очень новичок. У меня есть этот класс, где я хочу получать некоторые данные с веб-сайта один раз в день (здесь каждые секунды, потому что я его тестировал) в определенный час. Я хочу использовать модуль расписания и не могу понять, в чем проблема. Я использую 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 не может быть вызван. Что я делаю неправильно?


person User 147    schedule 09.09.2020    source источник
comment
Вы только когда-либо вызываете конструктор класса. Вы никогда не вызываете метод, который фактически делает запрос.   -  person Jonathon Reinhart    schedule 09.09.2020
comment
ОК, я могу вызвать его с помощью расписания... делать (impactBot.fetchCurrenciesData), как предложил другой пользователь, но программы все равно работают без вывода.   -  person User 147    schedule 09.09.2020
comment
Если вы хотите показать вывод, почему вы не помещаете вывод печати в метод fetchCurrenciesData   -  person Sovankiry    schedule 09.09.2020


Ответы (2)


Вам нужно вызвать класс для объекта инициализации, а затем вызвать метод класса объекта. для решения следуйте моему примеру:

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)
person Sovankiry    schedule 09.09.2020
comment
Отлично, у меня та же проблема, часами искал решение, спасибо, вы спасли мой день :) - person Houy Narun; 09.09.2020
comment
Спасибо, но я все еще получаю TypeError: первый аргумент должен быть вызываемым Error после того, как я сделал то, что вы написали - person User 147; 09.09.2020
comment
В Pycharm я также получаю эту ошибку из файла пакета расписания, если это помогает: *кваргс) - person User 147; 09.09.2020
comment
Как это должно работать? Bot().fetchCurrenciesData() будет выполнен только один раз, а результат (который нельзя вызвать) будет передан .do. - person L3viathan; 09.09.2020

Попробуй это:

impactBot = Bot()

schedule.every(5).seconds.do(impactBot.fetchCurrenciesData)

while True:
    schedule.run_pending()
    time.sleep(1)

schedule....do() нужен callable.

person L3viathan    schedule 09.09.2020
comment
Готово, но программы продолжают работать без вывода - person User 147; 09.09.2020
comment
@ User147 Почему вы ожидаете результат? Я не вижу никаких вызовов print, которые бы давали какие-то результаты. Вы просто хотите видеть r["data"] каждые 5 секунд? Затем поместите print(r["data"]) внутри метода fetchCurrenciesData (вместо того, чтобы возвращать его) - person L3viathan; 09.09.2020