2013-01-24 11 views
6

Próbujesz uzyskać interfejs MIDI do pracy z pygame na Ubuntu 12.04. Wiem, że klawiatura działa, ponieważ może kontrolować vkeybd i działa z PyGame na OSX, więc problem z MIDI w Pythonie.MIDI na Pythonie/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 zainstalowany przez menedżera pakietów, tak jak python-pm.

Wszelkie pomysły? :)

+0

uruchom ' ldd/usr/lib/libportmidi.so.0'. Czy pokazuje brakujące biblioteki? –

+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 (0x00007ff35a652000) ' ' /lib64/ld-linux-x86-64.so.2 (0x00007ff35b05e000) ' –

+0

Czego powinienem szukać? –

Odpowiedz

4

Chociaż nie odpowiemy dokładnie na twoje pytanie, może to pomóc w samodzielnym debugowaniu problemu.

Błąd to:

ImportError: /usr/lib/libportmidi.so.0: undefined symbol: snd_seq_event_input_pending 

undefined symbol awarii dynamicznego linkera, aby znaleźć kod wymagany dla funkcji snd_seq_event_input_pending.

Na przykładowym 32-bitowym systemie Oneiric możemy to zrobić, aby spojrzeć na niektóre symbole z libportmidi.so.0.

nm -DC /usr/lib/libportmidi.so.0 | grep snd_seq_event_input_pending 

U snd_seq_event_input_pending 

To mówi nam, że biblioteka libportmidi wymaga kod snd_seq_event_input_pending ale symbol jest niezdefiniowany. Aby funkcja libportmidi mogła działać, musi również załadować dodatkową bibliotekę, która zawiera tę funkcję.

Na Oneiric stwierdziłem, że ten symbol jest zdefiniowany w 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 wskazuje, że funkcja istnieje, to w tekście (kod) segmentu.

Zwykle łączenie powiązanych bibliotek następuje automatycznie, ponieważ libasound.so.2 powinien być oznaczony jako libportmidi. W tym samym systemie.

ldd /usr/lib/libportmidi.so.0 

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

co pokazuje, że libmidi zależy libasound. Na liście wyjściowej ldd w komentarzach nie ma odniesienia do libasound, więc nie będzie próbował automatycznie dynamicznie łączyć libasound.so.2 po załadowaniu, co spowoduje błąd.

Istnieje kilka powodów, dlaczego nie może być błąd:

  • Droga łącząca z libportmidi mogą mieć zmianę z sid precyzyjnemu. np. libportmidi może próbować znaleźć własne zależności dla libasound. (Mało prawdopodobne).
  • Istnieje błąd w pakowaniu libportmidi, w którym nie ma odniesienia do libasound.so.2, tak jak powinien. Może to być specyficzne dla platformy (np. Tylko błąd w 64-bitowych systemach).

Sugerowałbym, aby spróbować dowiedzieć się biblioteki w systemie, który zawiera funkcję snd_seq_event_input_pending a następnie pracować do tyłu, aby spróbować ustalić, dlaczego nie został on połączony z libportmidi.

Następujące polecenie basha pomoże ci znaleźć biblioteki implementujące snd_seq_event_input_pending.Jeśli nic nie znajdziesz, wystąpił problem z bibliotekami zainstalowanymi na twoim komputerze.

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

Wciąż się nad tym zastanawiam, ale to świetny początek.Myślę, że to da mi to, czego potrzebuję, sprawdzę ponownie i nagrodzę nagrodę, gdy tylko poprawię błąd w Ubuntu. –

1

Mam dokładnie ten sam problem (na Ubuntu 12.04.1), używając np. narzędzie do odtwarzania MIDI w Frescobaldi (która jest aplikacją Python). To działało dobrze, ale już nie.

Jest to oczywiście źle skompilowany pakiet portmidi, który został wypchnięty 2013-01-25, zobacz https://launchpad.net/ubuntu/+source/portmidi/1:200-0ubuntu1.12.04.1. Obniżenie do poprzedniego pakietu 1: 200-0ubuntu1 rozwiązało problem.

Domyślam się, że właściwym działaniem byłoby przesłanie zgłoszenia błędu do wersji 1: 200-0ubuntu1.12.04.1 na Launchpad pod numerem https://bugs.launchpad.net/ubuntu/+source/portmidi/+bugs. Jeśli nie zostanie naprawiony, możemy również poprosić falkTX, jeśli będzie on chciał dostarczyć pakiet roboczy w swoich PPA KXStudio.

Tak dla przypomnienia, oto co ldd daje do 1: 200-0ubuntu1 libportmidi na moim systemie:

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) 

i podziale 1: 200-0ubuntu1.12.04.1 wersji:

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) 

Tak więc każda aplikacja, która nie łączy się z samym libasound2, zostanie wywołana. W szczególności wydaje się, że tak jest w przypadku modułu Python portmidi. (Ten rodzaj błędu jest również pogarszany przez fakt, że, co najmniej od wersji Ubuntu 12.04, gcc domyślnie używa flagą --as-needed linker Założę się, że wciąż jest sporo pakietów w repozytoriach Ubuntu, które są uszkodzone . z tego powodu)

+0

Mam zgłoszenie błędu na https://bugs.launchpad.net/ubuntu/+source/portmidi/+bug/1110326 teraz. Jeśli wszyscy dotknięci tym błędem zrobią "tam też mnie atakują", może to nawet zostać zauważone. :) – agraef

+1

Znaleziono i naprawiono błąd, zobacz https://bugs.launchpad.net/ubuntu/+source/portmidi/+bug/1110326. Na razie załadowałem pakiet w Launchpad na https://launchpad.net/~dr-graef/+archive/test (proszę dać mu trochę czasu, 64-bitowy pakiet nadal czeka na zbudowanie czas tego pisania). – agraef

1

Jeśli chcesz naprawić to teraz można kasie najnowszą wersję portmidi i zbudować bibliotekę następująco (zakładając, że już wyrejestrowany lub rozpakowaniu portmidi w reż nazwie portmidi):

cd portmidi 
make -f pm_linux/Makefile 

Domyślna instalacja nie tworzy dynamicznej wersji biblioteki, więc musisz zbudować taką bibliotekę:

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 

Następnie można wykonać kopię starej biblioteki (na wszelki wypadek), a następnie skopiować ten nowy w jego miejsce:

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 

Twoje aplikacje powinny teraz działa ...

Powiązane problemy