在启动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)
)似乎会增加从l.running
获取True
的几率。最后,调试而不仅仅是运行可以保证获取True
。
感觉好像我需要为解释器提供足够的时间,以便running
能够“捕获”正在工作的侦听器。
我看过一些关于在运行和调试时获得不同输出的帖子,但它们涉及生成随机值,通常在C++中,甚至滥用变量作用域。
他们似乎没有什么用处,至少在我可怜的知识。
问题很简单:这里发生了什么?
我在Windows11上使用VSCode。
1条答案
按热度按时间sf6xfgos1#
pynput
侦听器在单独的线程上运行,以在主程序继续执行时获取键盘输入。可能存在计时问题,即当您立即检查侦听器的状态时,侦听器可能尚未注册为运行。通过添加额外语句提供的时间越多,当您检查侦听器时,侦听器运行的可能性就越大。另外,你还创建了一个竞态条件:主程序和侦听器线程都在访问
l.running
。根据操作系统如何调度线程以及侦听器线程何时更新l.running
,行为可能会有所不同。