我尝试了一些可以从其他线程中获得的解决方案,但仍然没有成功。 我的问题是程序可以识别我输入的字符,但不会执行以阻止程序循环运行。提前感谢任何帮助。 谢谢!
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()
在你的程序中
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
并终止正在运行的进程。