#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 Почему вы ожидаете вывода? Я не вижу никаких вызовов
r["data"]
каждые 5 секунд? Затем поместитеprint(r["data"])
внутрьfetchCurrenciesData
метода (вместо его возврата)