debugging pynput:使用pynput.keyboard.keyboard.running获得不同的输出(以“非阻塞方式”)

tsm1rwdh  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(168)

在启动pynputListener的“非阻塞方式”中,我使用下面的代码获得了不同的行为:

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。

sf6xfgos

sf6xfgos1#

pynput侦听器在单独的线程上运行,以在主程序继续执行时获取键盘输入。可能存在计时问题,即当您立即检查侦听器的状态时,侦听器可能尚未注册为运行。通过添加额外语句提供的时间越多,当您检查侦听器时,侦听器运行的可能性就越大。
另外,你还创建了一个竞态条件:主程序和侦听器线程都在访问l.running。根据操作系统如何调度线程以及侦听器线程何时更新l.running,行为可能会有所不同。

相关问题