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一样.
有任何想法吗?:)
尽管这不能完全回答您的问题,但它可能会帮助您自己调试问题。
错误是这样的:
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)