В коде Python ниже, как я могу немедленно выйти из кода?

Я пробовал ниже этого два дня, но не могу заставить его работать.

Я пытался

except KeyboardInterrupt:
sys.exit()
exit()
control+C

, и так далее.

Я попробовал код, но он завершается только через 30 секунд или 1 минуту. Кажется, что «слушатель» в коде усложняет код.

Мне нужно, чтобы код завершался немедленно, когда я нажимаю ESC. «Завершить» здесь означает остановить выполнение кода или закрыть весь терминал. В любом случае это нормально, но он должен работать «немедленно».

Я использую Windows10. Он не должен быть совместим с ОС MAC.

import pydirectinput
import datetime
import time
import threading
from pynput.mouse import Controller, Button
from pynput.keyboard import Listener, KeyCode
TOGGLE_KEY = KeyCode(char = "`")
clicking = False
mouse = Controller()

def clicker():    
    global fishpause
    global a_press
    global d_press
    global maxtime
    duration = 0
    while True and duration <= maxtime:
        qtime = datetime.datetime.utcnow()
        if qtime.hour == 11 and qtime.minute == 30: 
            print("Quiting by using an error...")
            pydirectinput.keydown('alt')                
        else:
            if clicking:
                mouse.press(Button.right)
                #print("Button pressed")
                goleft(fishpause, a_press)
                duration += 1
                print(f"Duration is: {duration}")
                time.sleep(0.5)
        time.sleep(0.5)
        mouse.release(Button.right)
    
def toggle_event(key):
    if key == TOGGLE_KEY:
        global clicking
        clicking = not clicking
        print("Clicking changed")

def goleft(fishpause, a_press):
    pydirectinput.press('a', presses=1, interval=a_press)
    print("Moving left")
    pydirectinput.PAUSE = fishpause
    print(f"PAUSING: {fishpause}")
  
maxtime = 4500
fishpause = 9.0 
a_press = 0.1 
time.sleep(1)
print("Starting")
pydirectinput.press('esc', presses=1, interval=0.1)
click_thread = threading.Thread(target=clicker)
click_thread.start()
time.sleep(3)
with Listener(on_press=toggle_event) as listener:
    listener.join()

Я думаю, вы найдете свой ответ здесь ссылка, но если мне нужно что-то с этим сделать, я предлагаю вам попробовать os._exit и процесс kill (pkill -f name-of-the-python-script)

Vuong Duong 20.11.2022 22:15

Да, я также пытался убить -9, но он останавливается очень медленно

acubens555 20.11.2022 22:24
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
1
2
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

click_thread = threading.Thread(target=clicker, daemon=True)

Затем он завершится при выходе из основной программы.

Вы можете проверить это с помощью крошечной программы ниже. Попробуйте с daemon=True и с daemon=None:

import threading
import time

def thread_loop():
    while True:
        print("!");
        time.sleep(.5)

if __name__ == '__main__':
    bkgnd = threading.Thread(target=thread_loop, daemon=True)
    bkgnd.start()
    print("exit main")

Текущие документы docs.python.org/3/library/threading.html#thread-objects

dirck 21.11.2022 04:11

Другие вопросы по теме