Ubuntu20下Python3.9中pygame.midi.Input.read转字符串触发PortMidi错误求助
问题根因
- 资源未正确释放:新增代码触发
else return分支时,程序直接退出函数,没有手动关闭pygame.midi.Input对象,也没有退出midi模块。pygame 1.9.6 版本的 midi 底层依赖 PortMidi,未主动关闭的指针会在对象被回收时触发「Bad pointer」异常。 - 数据处理方式错误:
pygame.midi.Input.read()返回的是结构化的列表数据,每个元素格式为[<MIDI消息列表>, <时间戳>],将其强制转换为字符串后再检索字符'1'的逻辑完全冗余,还可能出现预期外的匹配结果,也间接增加了程序异常概率。
解决方案
修复逻辑
- 所有退出路径都先释放midi相关资源,先调用输入对象的
close()方法,再调用pygame.midi.quit()释放全局资源 - 直接操作返回的原始列表做判断,不需要转换为字符串
修复后代码示例
import pygame.midi def truc(myinput): while True: if myinput.poll(): events = myinput.read(3) print(events) # 可根据实际业务需求调整判断规则,此处示例是判断所有MIDI消息中是否包含值为1的字段 has_target = any(1 in msg for msg, _ in events) if has_target: print('ok') else: # 释放资源后再退出 myinput.close() pygame.midi.quit() return if __name__ == "__main__": pygame.midi.init() my_input = pygame.midi.Input(3) truc(my_input)
可选优化
如果仍偶发异常,可将pygame升级到2.0及以上版本,2.x版本对Python 3.9的兼容性更好,也修复了大量midi模块的底层资源管理bug。
内容的提问来源于stack exchange,提问作者MeblIkea
相关产品推荐
相关产品推荐

