2013-01-24 48 views
6

Cố gắng để có được một giao diện MIDI để làm việc với pygame trên Ubuntu 12.04. Tôi biết bàn phím hoạt động vì nó có thể kiểm soát vkeybd và làm việc với PyGame trên OSX, do đó, vấn đề với với MIDI trong python.MIDI trên Python/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 được cài đặt thông qua trình quản lý gói, như là python-pm.

Bất kỳ ý tưởng nào? :)

+0

Run ' ldd/usr/lib/libportmidi.so.0'. Nó có hiển thị bất kỳ thư viện bị thiếu nào không? –

+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

Tôi nên tìm gì? –

Trả lời

4

Mặc dù điều này sẽ không trả lời chính xác câu hỏi của bạn, điều này có thể giúp bạn tự khắc phục sự cố.

Các lỗi là thế này:

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

Các undefined symbol là một thất bại của mối liên kết động để tìm mã cần thiết cho việc snd_seq_event_input_pending chức năng.

Trên ví dụ 32 bit Hệ thống Oneiric, chúng tôi có thể thực hiện việc này để xem một số biểu tượng của libportmidi.so.0.

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

U snd_seq_event_input_pending 

Điều này cho chúng tôi biết rằng thư viện libportmidi yêu cầu mã cho snd_seq_event_input_pending nhưng biểu tượng không xác định. Vì vậy, đối với libportmidi để hoạt động, nó cũng phải tải thêm một thư viện chứa hàm này.

Trên Oneiric tôi thấy rằng biểu tượng này được xác định trong 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 cho biết chức năng tồn tại và nằm trong đoạn văn bản (mã).

Thông thường, việc liên kết các thư viện được liên kết diễn ra tự động dưới dạng libasound.so.2 nên được tham chiếu bởi libportmidi. Trên cùng một hệ thống.

ldd /usr/lib/libportmidi.so.0 

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

thể hiện rằng libmidi tùy thuộc vào libasound. Trong danh sách đầu ra ldd trong nhận xét của bạn, không có tham chiếu đến libasound và do đó, nó sẽ không cố gắng tự động liên kết động libasound.so.2 khi được tải, dẫn đến lỗi của bạn.

Có một vài lý do tại sao có thể có một lỗi:

  • Cách liên kết từ libportmidi có thể có sự thay đổi từ Oneiric để chính xác. ví dụ: libportmidi có thể tìm phụ thuộc của riêng mình cho libasound. (Không chắc).
  • Có lỗi trong bao bì libportmidi nơi không tham chiếu libasound.so.2. Đây có thể là nền tảng cụ thể (ví dụ: chỉ có lỗi trên hệ thống 64 bit).

tôi đề nghị bạn nên cố gắng tìm hiểu các thư viện trên hệ thống của bạn có chứa các snd_seq_event_input_pending chức năng và sau đó làm việc ngược để thử và xác định lý do tại sao nó đã không được liên kết với libportmidi.

Lệnh bash sau đây sẽ giúp bạn tìm thấy các libaries thực hiện snd_seq_event_input_pending.Nếu bạn không tìm thấy bất cứ điều gì, có một vấn đề với các thư viện được cài đặt trên máy tính của bạn.

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

Vẫn đang điều tra điều này, đây là một khởi đầu tuyệt vời, tuyệt vời.Tôi nghĩ rằng điều này sẽ cho tôi những gì tôi cần, tôi sẽ kiểm tra lại và khen thưởng tiền thưởng một khi tôi nộp lỗi thích hợp trong Ubuntu. –

1

Tôi có cùng một vấn đề (trên Ubuntu 12.04.1), sử dụng ví dụ: công cụ phát lại MIDI trong Frescobaldi (là một ứng dụng Python). Điều này được sử dụng để làm việc tốt, nhưng không còn nữa.

Điều này rõ ràng là một gói portmidi bị nén sai được đẩy ra vào ngày 2013-01-25, xem https://launchpad.net/ubuntu/+source/portmidi/1:200-0ubuntu1.12.04.1. Hạ cấp xuống gói 1: 200-0ubuntu1 trước đã giải quyết được vấn đề cho tôi.

Tôi đoán rằng quá trình thích hợp của hành động sẽ là gửi báo cáo lỗi về phiên bản 1: 200-0ubuntu1.12.04.1 trên Launchpad tại https://bugs.launchpad.net/ubuntu/+source/portmidi/+bugs. Nếu nó không được cố định, chúng tôi cũng có thể yêu cầu falkTX nếu anh ta sẵn sàng cung cấp một gói làm việc trong các PPA của KXStudio thay thế.

Chỉ cần cho các hồ sơ, đây là những gì ldd cho cho tỷ lệ 1: libportmidi 200-0ubuntu1 trên hệ thống của tôi:

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) 

Và chia 1: 200-0ubuntu1.12.04.1 phiên bản:

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) 

Vì vậy, bất kỳ ứng dụng nào không xảy ra liên kết trong libasound2 đều sẽ được hosed. Cụ thể, đó có vẻ là trường hợp cho mô-đun portmidi Python. (Loại lỗi này cũng trầm trọng hơn bởi thực tế là, ít nhất là từ Ubuntu 12.04 trở đi, gcc sử dụng cờ liên kết --as-cần thiết theo mặc định. Tôi đặt cược rằng vẫn còn khá nhiều gói trong bản repo Ubuntu bị hỏng . vì lý do đó)

+0

Tôi đã gửi báo cáo lỗi tại https://bugs.launchpad.net/ubuntu/+source/portmidi/+bug/1110326 ngay bây giờ. Nếu tất cả mọi người bị ảnh hưởng bởi các lỗi không một "ảnh hưởng đến tôi quá" ở đó, nó thậm chí có thể nhận thấy. :) – agraef

+1

Tìm và sửa lỗi, vui lòng xem https://bugs.launchpad.net/ubuntu/+source/portmidi/+bug/1110326. Hiện tại, tôi đã tải lên một gói cố định tại Launchpad tại https://launchpad.net/~dr-graef/+archive/test (vui lòng cho nó một chút thời gian, gói 64 bit vẫn đang chờ để xây dựng tại thời gian của bài viết này). – agraef

1

Nếu bạn muốn sửa chữa nó bây giờ bạn có thể kiểm tra các phiên bản mới nhất của portmidi và xây dựng thư viện như sau (giả sử bạn đã kiểm tra ra hoặc portmidi giải nén vào một thư mục gọi là portmidi):

cd portmidi 
make -f pm_linux/Makefile 

Cài đặt mặc định không xây dựng phiên bản thư viện động nên bạn cần phải tạo một phiên bản như sau:

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 

Sau đó, bạn có thể tạo một bản sao của thư viện cũ (chỉ trong trường hợp), và sau đó sao chép này mới ở chỗ của nó:

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 

ứng dụng của bạn bây giờ nên làm việc ...

Các vấn đề liên quan