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

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

在启动

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。

python debugging listener pynput
1个回答
0
投票

pynput
侦听器在单独的线程上运行,以在主程序继续执行时获取键盘输入。可能存在计时问题,当您立即检查侦听器的状态时,侦听器可能尚未注册为正在运行。通过添加额外语句提供的时间越多,在检查侦听器时运行侦听器的可能性就越大。

此外,您还创建了一个竞争条件:主程序和侦听器线程都在访问

l.running
。根据操作系统调度线程的方式以及侦听器线程何时更新
l.running
,行为可能会有所不同。

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