在启动
pynput
Listener
的“非阻塞方式”中,我使用下面的代码得到了不同的行为:
from time import sleep
import pynput
def stop(k):
if k:
print("end")
l.stop()
l = pynput.keyboard.Listener(on_press=stop)
l.start()
print(l.running)
while True:
if l.running:
print("running\n")
sleep(1)
else: break
有时我会得到
False
并且程序结束。其他时候,False
然后循环运行。print(l.running)
,对于这两个语句,我可能会得到 True
。l.start()
之后添加代码(例如复制 print(l.running)
)似乎会增加从 True
获得 l.running
的几率。
最后,调试而不是仅仅运行可以保证获得True
。running
能够“捕捉”听众的工作。
我看过一些关于在运行与调试时获得不同输出的帖子,但它们涉及生成随机值(通常是在 C++ 中),甚至是滥用变量范围。
它们似乎没什么用,至少就我所知而言。
问题很简单:这里发生了什么?
我在 Windows11 上使用 VSCode。
pynput
侦听器在单独的线程上运行,以在主程序继续执行时获取键盘输入。可能存在计时问题,当您立即检查侦听器的状态时,侦听器可能尚未注册为正在运行。通过添加额外语句提供的时间越多,在检查侦听器时运行侦听器的可能性就越大。
此外,您还创建了一个竞争条件:主程序和侦听器线程都在访问
l.running
。根据操作系统调度线程的方式以及侦听器线程何时更新l.running
,行为可能会有所不同。