使用pygame.midi播放MIDI音符触发Segmentation Fault问题求助
解决pygame.midi播放音符时的Segmentation Fault错误
你遇到的这个段错误,大概率是因为指定了无效的MIDI输出设备ID导致的——直接用0不一定对应系统里可用的输出设备,底层代码访问无效内存就会触发崩溃。下面是几个针对性的解决步骤:
1. 先找到正确的MIDI输出设备ID
首先运行这段代码,列出系统里所有MIDI设备,筛选出支持输出的设备:
import pygame.midi pygame.midi.init() for device_id in range(pygame.midi.get_count()): info = pygame.midi.get_device_info(device_id) # 设备信息元组的第3个元素为1,表示是输出设备 is_output = info[2] == 1 device_name = info[1].decode('utf-8') print(f"设备ID: {device_id} | 名称: {device_name} | 是否输出设备: {is_output}") pygame.midi.quit()
从输出里挑出是否输出设备为True的ID,替换你代码里pygame.midi.Output(0)中的0即可。
2. 确保系统有可用的MIDI输出设备
如果上面的代码没找到任何输出设备,你需要先配置系统的MIDI输出:
- Windows:检查是否启用了「Microsoft GS Wavetable Synth」,在声音设置的MIDI选项里可以找到;若没有,安装虚拟MIDI设备(比如LoopBe1)。
- Linux:安装
timidity提供MIDI合成支持,终端运行sudo apt install timidity。 - macOS:系统自带CoreMIDI,一般默认有输出设备,若缺失可安装虚拟MIDI工具。
3. 优化代码的资源释放逻辑
资源未正确释放也可能引发崩溃,建议用try-finally确保player被销毁后再退出pygame.midi:
import pygame import pygame.midi import time pygame.midi.init() player = None try: # 替换成你找到的正确设备ID player = pygame.midi.Output(1) player.set_instrument(42) player.note_on(60, 127) time.sleep(3) player.note_off(60, 127) finally: if player is not None: del player # 必须先销毁player再执行quit pygame.midi.quit()
4. 更新或重新安装pygame
如果以上方法都无效,可能是pygame版本与系统不兼容,尝试升级或重装:
pip install --upgrade pygame
注意如果用了虚拟环境,要先激活环境再执行这条命令。
内容的提问来源于stack exchange,提问作者Peter-Andre




