在Python/PyGame上的MIDI,Ubuntu 12.04

Ric*_*nes 6 python ubuntu midi pygame

试图让一个MIDI接口在Ubuntu 12.04上使用pygame.我知道键盘有效,因为它可以控制vkeybd并在OSX上使用PyGame,所以在python中使用MIDI的问题.

$ python -m pygame.examples.midi --list

Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/dist-packages/pygame/examples/midi.py", line 820, in <module>
    print_device_info()
  File "/usr/lib/python2.7/dist-packages/pygame/examples/midi.py", line 25, in     print_device_info
    pygame.midi.init()
  File "/usr/lib/python2.7/dist-packages/pygame/midi.py", line 71, in init
    import pygame.pypm
ImportError: /usr/lib/libportmidi.so.0: undefined symbol: snd_seq_event_input_pending
Run Code Online (Sandbox Code Playgroud)

通过包管理器安装python-pygame,就像python-pm一样.

有任何想法吗?:)

Aus*_*ips 4

尽管这不能完全回答您的问题,但它可能会帮助您自己调试问题。

错误是这样的:

ImportError: /usr/lib/libportmidi.so.0: undefined symbol: snd_seq_event_input_pending
Run Code Online (Sandbox Code Playgroud)

undefined symbol是动态链接器无法找到该snd_seq_event_input_pending函数所需的代码。

在 32 位 Oneiric 系统示例中,我们可以这样做来查看 的一些符号libportmidi.so.0

nm -DC /usr/lib/libportmidi.so.0 | grep snd_seq_event_input_pending

U snd_seq_event_input_pending
Run Code Online (Sandbox Code Playgroud)

这告诉我们该libportmidi库需要代码,snd_seq_event_input_pending但符号未定义。因此,为了libportmidi发挥作用,它还必须加载一个包含此功能的附加库。

在 Oneiric 上我发现这个符号是在libasound2.so.2.

nm -DC /usr/lib/i386-linux-gnu/libasound.so.2 | grep snd_seq_event_input_pending

000a0fa0 T snd_seq_event_input_pending
Run Code Online (Sandbox Code Playgroud)

表示T该函数存在并且位于文本(代码)段中。

通常,关联库的链接会自动发生,libasound.so.2应由libportmidi. 在同一个系统上。

ldd /usr/lib/libportmidi.so.0

....
libasound.so.2 => /usr/lib/i386-linux-gnu/libasound.so.2 (0x00e35000)
Run Code Online (Sandbox Code Playgroud)

这表明这libmidi取决于libasound. 在ldd注释中的输出列表中没有引用,因此它在加载时libasound不会尝试自动动态链接,从而导致错误。libasound.so.2

可能出现错误的原因有以下几个:

  • 链接方式libportmidi可能已从 Oneiric 更改为 Precise。例如libportmidi可能会尝试找到它自己的依赖关系libasound。(不太可能)。
  • 包装中存在一个错误,libportmidi它没有libasound.so.2按应有的方式进行引用。这可能是特定于平台的(例如,仅在 64 位系统上出现错误)。

我建议您尝试找出系统上包含该snd_seq_event_input_pending函数的库,然后向后尝试确定它尚未与libportmidi.

以下 bash 命令将帮助您找到实现snd_seq_event_input_pending. 如果您没有找到任何内容,则表明您的计算机上安装的库存在问题。

find /lib /usr/lib -name "lib*.so.*" | while read f; do
    if nm -DC "$f" | grep -q 'T snd_seq_event_input_pending'; then
        echo "$f"
    fi
done
Run Code Online (Sandbox Code Playgroud)