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

#python #python-3.x #python-requests #schedule #python-class

#python #python-3.x #python-запросы #Расписание #python-class

Вопрос:

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

Комментарии:

1. Вы вызываете только конструктор класса. Вы никогда не вызываете метод, который фактически выполняет запрос.

2. Хорошо, я могу вызвать это с помощью «schedule…do .(impactBot.fetchCurrenciesData)» как предположил другой пользователь, но программы по-прежнему выполняются без вывода

3. Если вы хотите показать вывод, почему вы не помещаете параметр печати в метод fetchCurrenciesData

Ответ №1:

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

 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)
  

Комментарии:

1. Отлично, у меня та же проблема, я часами искал решение в Google, спасибо, вы спасли мой день 🙂

2. Спасибо, но я все еще получаю ошибку «TypeError: первый аргумент должен быть вызываемым» после того, как я сделал то, что вы написали

3. В Pycharm я также получаю эту ошибку из файла пакета расписания, если это помогает: /…/site-packages/schedule/__init__.py , строка 440, в do self.job_func = functools.partial(job_func, * аргументы, **kwargs)

4. Как это должно работать? Bot().fetchCurrenciesData() будет выполняться только один раз, и результат (который нельзя вызвать) будет передан .do .

Ответ №2:

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

 impactBot = Bot()

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

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

schedule....do() требуется вызываемый.

Комментарии:

1. Выполнено, но программы по-прежнему продолжают работать без вывода

2. @User147 Почему вы ожидаете вывода? Я не вижу никаких вызовов print , которые могли бы выдать какой-либо результат. Вы просто хотите «видеть» r["data"] каждые 5 секунд? Затем поместите print(r["data"]) внутрь fetchCurrenciesData метода (вместо его возврата)