代码在Jupyter(Anaconda)中正常运行但普通Python环境不行——原因何在?
为什么键盘监听代码在Jupyter正常运行但普通Python环境只生成空日志?
咱们先拆解下问题:你这段监听键盘的代码在Jupyter(Anaconda)里能完美记录按键,但放到普通Python IDE或控制台里,只会生成空的log.txt,完全没按键内容,对吧?
核心原因:主线程的生命周期差异
- 在Jupyter环境中,代码单元格执行后,Jupyter的内核进程会一直保持活跃状态,不会自动退出。这就给
keyboard.hook()注册的监听器留足了时间去捕获按键事件,自然能正常写入日志。 - 而在普通Python环境里,脚本执行顺序是这样的:
- 导入
keyboard库 - 定义
on_key回调函数 - 打开
log.txt文件 - 注册键盘钩子
keyboard.hook(on_key) - 脚本执行到这里就直接结束了,主线程退出,整个进程随之终止。钩子刚注册好还没来得及监听任何按键,就跟着进程一起死掉了,所以日志文件是空的。
- 导入
解决办法:让主线程保持运行
你只需要在代码末尾加一行代码,让主线程进入阻塞状态,这样进程就不会立刻退出,钩子就能持续监听按键了。有两种常用方式:
方式1:使用keyboard.wait()(推荐)
这是keyboard库专门提供的阻塞方法,会一直等待直到你按下指定的结束键(比如Esc):
import keyboard def on_key(key): file.write(str(key.__dict__) + "\n") file.flush() file = open("./log.txt", "w", encoding="utf-8") keyboard.hook(on_key) # 阻塞主线程,直到按下Esc键才退出 keyboard.wait("esc") # 记得最后关闭文件 file.close()
方式2:用无限循环+睡眠
如果不想指定结束键,也可以用while True循环让主线程一直运行,不过要记得加time.sleep()避免占用过多CPU:
import keyboard import time def on_key(key): file.write(str(key.__dict__) + "\n") file.flush() file = open("./log.txt", "w", encoding="utf-8") keyboard.hook(on_key) # 无限循环保持进程活跃,按Ctrl+C终止 while True: time.sleep(1) file.close()
额外提醒
不管用哪种方式,记得最后要关闭文件(或者用with语句打开文件,更安全),避免资源泄漏。比如用with改写的版本:
import keyboard def on_key(key): with open("./log.txt", "a", encoding="utf-8") as file: # 用追加模式避免覆盖 file.write(str(key.__dict__) + "\n") keyboard.hook(on_key) keyboard.wait("esc")
这样就算进程意外退出,文件也会自动关闭,不会出现损坏的情况。
内容的提问来源于stack exchange,提问作者Sarrix
相关产品推荐
相关产品推荐

