2013-01-24 79 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 

您的應用程序現在應該工作...