You need to enable JavaScript to run this app. Ubuntu20下Python3.9中pygame.midi.Input.read转字符串触发PortMidi错误求助
优惠活动
大模型
产品
解决方案
定价
更多

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'的逻辑完全冗余,还可能出现预期外的匹配结果,也间接增加了程序异常概率。
解决方案

修复逻辑

  1. 所有退出路径都先释放midi相关资源,先调用输入对象的close()方法,再调用pygame.midi.quit()释放全局资源
  2. 直接操作返回的原始列表做判断,不需要转换为字符串

修复后代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 11:54:07