在 Python 3.x 中不按 Enter 键即可停止使用字符运行的程序

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

我尝试了一些可以从其他线程中获得的解决方案,但仍然没有成功。 我的问题是程序可以识别我输入的字符,但不会执行以阻止程序循环运行。提前感谢任何帮助。 谢谢!

from pynput import keyboard
import sys
from time import sleep

def stop_program():
    sys.exit()

def run_program():
    while True:
        print('Program is running now... press \'x\' to stop')
        sleep(1)

def on_press(key):
    try:      
        if str(key) == "'x'":
            stop_program()        
       
    except AttributeError:
        pass

#non-blocking
listener = keyboard.Listener(
    on_press=on_press)

listener.start()

run_program()
python-3.x python-3.9 pynput
1个回答
0
投票

在你的程序中

sys.exit()
不会终止主进程。它终止使用
keyboard.Listener.start
生成的子线程。您可以通过在上方和下方添加 print 语句来验证这一点
sys.exit()
:

def stop_program():
    print("This will be printed")
    sys.exit()
    print("This will not be printed")

来自文档

sys.exit([arg])

退出Python。这是通过引发 SystemExit 异常来实现的,因此会遵循 try 语句的 finally 子句指定的清理操作,并且可以在外部级别拦截退出尝试。
...
由于 exit() 最终“仅”引发异常,因此它仅在从主线程调用时退出进程,并且异常不会被拦截。

另一种方法是调用

os._exit(1)
而不是
sys.exit()
。这可以从子线程终止进程,并且应该适用于您的用例。

或者,如果您只是想要一个终止程序的快捷方式,请在终端中按 Ctrl+C 应该会出现

KeyboardInterrupt
并终止正在运行的进程。

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