Как поставить выполнение всего скрипта на паузу?
У меня есть скрипт который в с некоторой периодичностью двигает мышкой и обновляет страницу (нажимает ф5). Я хочу чтобы была возможность поставить скрипт на паузу (чтобы таймер который отсчитывает время до передвижения мышки и обновления страницы замораживался по нажатию клавиши или сочетания клавиш), а также чтобы осталась возможность быстрого закрытия нажатием ctrl + shift + alt + s.
import random
import pyautogui as pg
from time import sleep
import os
import signal
import keyboard
import multiprocessing as mp
# процесс убийства приложения
def hook(pid):
while True:
if keyboard.is_pressed('ctrl + shift + alt + s'):
os.kill(pid,signal.SIGTERM)
os._exit(1)
def pause():
while True:
if keyboard.is_pressed("ctrl + shift + alt + p"):
print('Скрипт приостановлен, нажмите p для продолжения')
keyboard.wait('p')
print("Скрипт продолжается...")
continue
if __name__ == '__main__':
pid = os.getpid()
mp.Process(target=hook,args=[pid]).start()
# случайные движения мышкой + перезагрузка страницы
while True:
mp.Process(target=pause).start()
a, b, c = random.randint(500,1000), random.randint(300,600), random.randint(1, 5)
try:
sleep(10)
pg.moveTo(a, b, c)
sleep(40)
pg.press('f5')
except KeyboardInterrupt:
break
Я пытался сделать отдельную функцию pause, разными методами (ожидание инпута, keyboard.wait и др), но скрипт либо ломался, либо не останавливался.
Ответы (1 шт):
Можно исполнить через threading. К примеру так:
import random
import pyautogui as pg
from time import sleep
import os
import keyboard
import threading
flag = True # Флаг состояния потока moveTo_pressF5_thread
# Функция для убийства приложения
def hook_exit():
while True:
if keyboard.is_pressed('ctrl + shift + alt + s'):
os._exit(1)
# Функция для случайных движений мышкой и перезагрузки страницы
def moveTo_pressF5():
global flag
while flag:
a, b, c = random.randint(500,1000), random.randint(300,600), random.randint(1, 5)
sleep(10)
pg.moveTo(a, b, c)
sleep(40)
pg.press('f5')
if __name__ == '__main__':
# Создаем поток для выхода по нажатию сочетания клавишь
hook_exit_thread = threading.Thread(target=hook_exit)
hook_exit_thread.start() # Запускаем поток
# Создаем поток для движении мыши и обновления страницы
moveTo_pressF5_thread = threading.Thread(target=moveTo_pressF5)
moveTo_pressF5_thread.start() # Запускаем поток
while True:
if keyboard.is_pressed("ctrl + shift + alt + p"):
flag = False
print('Скрипт приостановлен, нажмите p для продолжения')
keyboard.wait('p')
flag = True
moveTo_pressF5_thread = threading.Thread(target=moveTo_pressF5)
moveTo_pressF5_thread.start()
print("Скрипт продолжается...")
Дополнение:
Сам thread можно остановить только по флагу(завершению итерации цикла), но если нужно именно "убить", то воспользуйтесь multiprocessing, у него есть метод .terminate().
import multiprocessing
import time
def my_function():
while True:
print("Running...")
time.sleep(1)
# Создаем процесс
my_process = multiprocessing.Process(target=my_function)
# Запускаем процесс
my_process.start()
# Ждем 5 секунд
time.sleep(5)
# Принудительно завершаем процесс
my_process.terminate()
# Ждем 5 секунд для наглядности
time.sleep(5)
print("!!!")