Не работает планировщик задач schedule
У меня есть скрипт, который выкладывает посты в вк, хочу чтобы он выкладывал их, каждый день в определенное время. Для теста, решил поставить выполнения скрипта скрипта через 5 секунд. Но почему то ничего не работает, запускаю скрипт, потом захожу в группу, через 10 секунд, куда должен был выложиться пост, там ничего нет. Потом выполняю скрипт без библиотеки schedule, все работает. Подскажите в чем проблема?
КОД:
import requests
import time
import schedule
test = '-63869928'
text = 'Test, Test, Test'
image = 'photo395296157_457250641'
global token
token = 'Мой токен'
def safe_file():
a = requests.post('https://api.vk.com/method/wall.post', data={
'owner_id': test,
"access_token": token,
'v': 5.122,
'message': text,
'attachments': image,
}).json()
print(a)
def parser():
print('\n', ' Начинается выгрузка постов', '\n', ' Пожалуйста подождите...')
safe_file()
print(' Готово!')
# parser()
job1 = schedule.every(5).seconds.do(parser)
for i in range(2):
schedule.run_pending()
time.sleep(1)
schedule.cancel_job(job1)
Ответы (1 шт):
Вы используете цикл for i in range(2), который вызовет schedule.run_pending() всего два раза. Следовательно scheduler, который ждёт 5 секунд никогда не выполнится.
Вот код для примера:
import time
import schedule
def function():
print("Function complete!")
job = schedule.every(5).seconds.do(function)
for i in range(2):
print(5 - i, "seconds left")
schedule.run_pending()
time.sleep(1)
schedule.cancel_job(job)
print("Canceled")
Вывод:
5 seconds left
4 seconds left
Canceled
Вы может использовать:
import time
import schedule
def function():
print("Function complete!\n")
job = schedule.every(5).seconds.do(function)
i = 5
while True:
print(i, "seconds left")
if i == 0: i = 5
i -= 1
schedule.run_pending()
time.sleep(1)
Вывод:
5 seconds left
4 seconds left
3 seconds left
2 seconds left
1 seconds left
0 seconds left
Function complete!
4 seconds left
3 seconds left
2 seconds left
1 seconds left
0 seconds left
Function complete!
Вы сказали:
хочу чтобы он выкладывал их, каждый день в определенное время
следовательно вам не нужен:
schedule.cancel_job(job)
Достаточно настроить задержку или использовать:
schedule.every().day.at("time").do(job)
Но если вам всё же нужно отменять задачу, можно сделать что-то вроде:
i = 5
canceled = False
while True:
print(i, "seconds left")
if i == 0: i = 5
if canceled:
schedule.cancel_job(job)
break
i -= 1
schedule.run_pending()
time.sleep(1)
Когда canceled станет равен True - scheduler остановится.