使用pydualsense读取PS5控制器输入突发停止报错求助
PS5手柄pydualsense读取数秒后报错的排查与解决
问题根源分析
你的代码存在两个核心问题,直接导致线程异常和资源泄漏:
- 重复创建手柄实例且未释放:每次调用
input_check()都会新建pydualsense实例并初始化,但函数触发按键后直接return,后续的dualsense.close()永远不会执行。多次调用后,系统中堆积大量未释放的手柄资源,引发线程冲突报错。 - 无限循环重复初始化:外层
while True持续调用input_check(),不断创建新的手柄连接,超出设备的并发访问限制。
修复步骤
- 全局初始化手柄实例:将手柄的初始化和关闭逻辑移到循环外部,确保整个程序生命周期内只创建一个手柄连接。
- 确保资源正确释放:使用
try/finally块捕获中断信号,保证程序退出时能关闭手柄设备。 - 添加按键触发延迟:避免单次按键被重复识别,提升输入稳定性。
修复后完整代码示例
from pydualsense import pydualsense import time def main(): # 仅初始化一次PS5手柄 dualsense = pydualsense() dualsense.init() try: while True: # 检测按键输入 if dualsense.state.options: print('option') time.sleep(0.1) # 防止重复触发 elif dualsense.state.ps: print('ps') time.sleep(0.1) elif dualsense.state.triangle: print('triangle') time.sleep(0.1) elif dualsense.state.square: print('square') time.sleep(0.1) elif dualsense.state.cross: print('cross') time.sleep(0.1) elif dualsense.state.circle: print('circle') time.sleep(0.1) except KeyboardInterrupt: # 捕获Ctrl+C中断,确保程序优雅退出 pass finally: # 无论程序如何结束,都关闭手柄设备 dualsense.close() if __name__ == "__main__": main()
额外排查点
- 更新pydualsense版本:执行
pip install --upgrade pydualsense,修复库本身可能存在的线程或设备兼容问题。 - 检查手柄连接:优先使用有线连接,避免蓝牙不稳定导致的设备访问异常;关闭其他可能占用手柄的软件(如Steam控制器管理器、其他手柄测试工具)。
- 获取完整报错信息:当前报错只显示了线程栈的顶部,完整的traceback会暴露具体错误类型(如设备权限不足、IO读写失败),有助于进一步定位问题。
内容的提问来源于stack exchange,提问作者Tai
相关产品推荐
相关产品推荐

