2013-01-24 38 views
6

尝试在Ubuntu 12.04上使用pygame获得MIDI接口。我知道键盘的作品,因为它可以控制vkeybd,并与OSX上的PyGame一起工作,所以与Python中的MIDI问题。Python上的MIDI/PyGame,Ubuntu 12.04

$ 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一样。

任何想法? :)

+0

运行' ldd/usr/lib/libportmidi.so.0'。它显示任何缺少的库吗? –

+0

'ldd/usr/lib/libportmidi.so.0' 'linux-vdso.so.1 =>(0x00007fffdabff000)' 'libporttime.so.0 => /usr/lib/libporttime.so.0(0x00007ff35ac2f000 )'' libc.so.6的=> /lib/x86_64-linux-gnu/libc.so.6(0x00007ff35a870000)'' = libpthread.so.0> /lib/x86_64-linux-gnu/libpthread.so 0.0(0x00007ff35a652000)'' /lib64/ld-linux-x86-64.so.2(0x00007ff35b05e000)' –

+0

我应该怎么找? –

回答

4

虽然这不会完全回答你的问题,但它可以帮助你自己调试问题。

的错误是这样的:

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正常工作,它还必须加载包含此功能的附加库。

On 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链接可能从解梦精确变化的方式。例如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 
+0

仍然在研究这个,虽然这是一个很棒的,真棒的开始。我认为这会给我我需要的东西,一旦我在Ubuntu中提交适当的错误,我会检查并奖励赏金。 –

1

我有完全相同的问题(在Ubuntu 12.04.1上),使用例如: Frescobaldi中的MIDI回放工具(这是一个Python应用程序)。这用于正常工作,但现在不再了。

这是很明显一个编译错误portmidi包,它是在推出到2013年1月25日,看到https://launchpad.net/ubuntu/+source/portmidi/1:200-0ubuntu1.12.04.1。降级到之前的1:200-0ubuntu1软件包解决了我的问题。

我想正确的做法是在https://bugs.launchpad.net/ubuntu/+source/portmidi/+bugs的Launchpad上针对1:200-0ubuntu1.12.04.1版本提交错误报告。如果问题得不到解决,我们可能会问falkTX他是否愿意在他的KXStudio PPA中提供工作包。

只是为了记录在案,这里就是ldd的为1给出:

linux-vdso.so.1 => (0x00007fffe9bff000) 
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007f26264cb000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f26262ae000) 
libporttime.so.0 => /usr/lib/libporttime.so.0 (0x00007f26260ab000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2625cec000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f26259f0000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f26257eb000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f26255e3000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f26269f4000) 

而破1:200-0ubuntu1.12.04.1版本:

linux-vdso.so.1 => (0x00007fff9e3ff000) 
libporttime.so.0 => /usr/lib/libporttime.so.0 (0x00007fb84ac71000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb84a8b2000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb84a694000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fb84b0af000) 
我的系统上200-0ubuntu1 libportmidi

所以这不会发生被自己的libasound2链接的任何应用程序将被大清洗。具体来说,Python portmidi模块似乎就是这种情况。 (至少从Ubuntu 12.04开始,gcc默认使用--as-needed连接器标志,这种错误同样加剧了。我敢打赌,在Ubuntu的软件仓库中仍然有很多软件包被破坏。正因为如此)

+0

我已经在https://bugs.launchpad.net/ubuntu/+source/portmidi/+bug/1110326上提交了一个错误报告。如果每个人都受到这个错误的影响,那么“也会影响到我”,它甚至会被注意到。 :) – agraef

+1

找到并修复了这个错误,请参阅https://bugs.launchpad.net/ubuntu/+source/portmidi/+bug/1110326。目前,我已经在Launchpad上上传了一个固定的包,在https://launchpad.net/~dr-graef/+archive/test(请给它一些时间,64位包仍然在等待构建写这篇文章的时间)。 – agraef

1

如果要立即解决它,你可以检出最新版本的portmidi和如下构建库(假设你已经签出或解压portmidi成目录名为portmidi):

cd portmidi 
make -f pm_linux/Makefile 

默认安装不会构建库的动态版本,因此您需要构建如下所示的代码:

gcc -shared -Wl,-soname,libportmidi.so.0 -o pm_linux/libportmidi.so.0 pm_common/pmutil.o pm_linux/pmlinuxalsa.o pm_linux/pmlinux.o pm_common/portmidi.o -lasound 

然后你就可以在旧库(以防万一)的副本,然后复制它的位置这个新:

sudo cp /usr/lib/libportmidi.so.0 /usr/lib/libportmidi.so.0.orig 
sudo cp pm_linux/libportmidi.so.0 /usr/lib/libportmidi.so.0 

您的应用程序现在应该工作...