试图让MIDI接口(interface)与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

python-pygame是通过软件包管理器安装的,就像python-pm一样。

有任何想法吗? :)

最佳答案

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

错误是这样的:

ImportError: /usr/lib/libportmidi.so.0: undefined symbol: snd_seq_event_input_pending
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

这告诉我们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
T表示该功能存在,并且位于文本(代码)段中。

通常,关联库的链接会自动发生,因为libasound.so.2应该引用libportmidi。在同一系统上。
ldd /usr/lib/libportmidi.so.0

....
libasound.so.2 => /usr/lib/i386-linux-gnu/libasound.so.2 (0x00e35000)

这表明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
    

    关于python - MIDI on Python/PyGame,Ubuntu 12.04,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14493857/

    10-15 22:56