当系统忙于远离终端执行任务时,如何通过键盘输入立即终止Python程序

问题描述 投票:0回答:1

我正在使用 python 构建一个自动化系统,需要选项卡切换、鼠标单击等,这完全占用了我的系统。在此期间,我无法访问终端或任务栏来手动关闭/停止程序运行。

当自动化正在运行并且出现问题时,很难切换到终端并按 CTRL + C 来停止执行,因为它随着自动化而崩溃,使其变得更加混乱。

我尝试使用 pynput 的键盘库,因为我将其用于自动化,但我找不到同时运行两个脚本的方法。

请帮助我如何停止我的应用程序,而不干扰其通过键盘输入(如 esc 键、多线程或任何其他我可以使用它的方式)的流程,谢谢。

import json
import automated as auto

# Read the data from the JSON file
with open('mouse.json', 'r') as f:
  data = json.load(f)

# Convert lists back to tuples
account_location = [tuple(lst) for lst in data["account_location"]]
tab_location = [tuple(lst) for lst in data["tab_location"]]

auto.open_ms()
auto.full_screen()
auto.scroll_down()
auto.open_all_accounts(account_location)

for i in range(2): # 2 times for 8 accounts ( 4 accounts per time )
  auto.position_tabs()
  count = 0
  auto.search_tabs(count, tab_location)
  auto.exit_tabs()

auto.shutdown()

注意:我不考虑粘贴automatic.py 文件,因为它只是一堆循环和键盘输入。只是为了确保此代码不在循环中。

一种无需与终端交互即可随时停止 python 程序执行的方式/方法。

python multithreading keyboard
1个回答
0
投票

您可以通过使用多线程和键盘侦听器的组合来解决此问题,这将允许您随时停止脚本而不干扰自动化流程。您可以使用

pynput
库在单独的线程中进行键盘监控,并在按下特定键(如
ESC
)时停止主要自动化。

这是代码。

  • 首先,您需要安装
    pynput
pip install pynput
  • 修改您的代码以包含多线程和键盘侦听器。
import json
import automated as auto
from pynput import keyboard
import threading
import sys

# Flag to control stopping the automation
stop_flag = False

def on_press(key):
    global stop_flag
    try:
        # If ESC is pressed, set the flag to True to stop the automation
        if key == keyboard.Key.esc:
            print("ESC pressed. Stopping automation...")
            stop_flag = True
            
            return False  # Stop the listener
    except Exception as e:
        print(f"Error in listener: {e}")

def run_automation():
    global stop_flag
    # Read the data from the JSON file
    with open('mouse.json', 'r') as f:
        data = json.load(f)

    # Convert lists back to tuples
    account_location = [tuple(lst) for lst in data["account_location"]]
    tab_location = [tuple(lst) for lst in data["tab_location"]]

    auto.open_ms()
    auto.full_screen()
    auto.scroll_down()
    auto.open_all_accounts(account_location)

    for i in range(2):  # 2 times for 8 accounts ( 4 accounts per time )
        if stop_flag:  # Check if stop is requested
            print("Automation stopped.")
            return
        auto.position_tabs()
        count = 0
        auto.search_tabs(count, tab_location)
        auto.exit_tabs()

    auto.shutdown()

# Run the automation in a separate thread
automation_thread = threading.Thread(target=run_automation)
automation_thread.start()

# Start keyboard listener in the main thread
with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

# Join automation thread after listener is done
automation_thread.join()

希望这对你有一点帮助。

© www.soinside.com 2019 - 2024. All rights reserved.