试图让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/