使用Python Inputs模块获取按键输入时触发多进程RuntimeError问题求助
解决inputs模块触发的RuntimeError与AttributeError问题
我来帮你分析下这个问题,核心原因是代码结构不符合Python多进程的规范,加上调用inputs.get_key()的位置不对,才导致了这些连锁错误。
问题根源
当你直接运行Python脚本时,整个模块会被完整加载执行。inputs模块内部依赖多进程来监听输入设备,当它启动子进程时,子进程会重新加载你的脚本。如果像你那样把events = inputs.get_key()放在if __name__ == '__main__':外面,子进程就会再次执行这段代码,进而触发多进程启动的冲突(也就是那个RuntimeError)。而Python Shell是交互式环境,不会重复加载模块,所以不会出现这个问题。
另外你看到的AttributeError: 'NoneType' object has no attribute 'terminate'是RuntimeError引发的后续错误——因为主进程初始化失败,输入设备的子进程没有正确创建,最后在销毁对象时调用terminate()自然就会报错。
修正方案
你需要把所有实际执行的代码(包括调用inputs.get_key())都放到if __name__ == '__main__':代码块里,并且确保freeze_support()在任何多进程相关操作之前调用。修正后的代码如下:
import inputs from multiprocessing import freeze_support # 别忘了导入freeze_support if __name__ == '__main__': freeze_support() # 先调用这个,再执行其他操作 events = inputs.get_key() # 把获取按键的代码移到这里 # 这里可以添加处理按键事件的逻辑 print(events)
额外说明
freeze_support()主要是为脚本打包成可执行文件(比如用PyInstaller)时准备的,如果不需要打包,其实可以省略这一行,但加上也不会有问题。- 把代码放到
if __name__ == '__main__':块里是Python多进程编程的标准规范,能从根源上避免子进程重复执行模块级别的代码,解决这类启动冲突问题。
内容的提问来源于stack exchange,提问作者Dextron
相关产品推荐
相关产品推荐

