2010-08-14 29 views
6

Tôi có một Thư viện C++ repeater.so mà tôi có thể tải từ Python trong Linux theo cách sau:Python ctypes không tải thư viện năng động trên Mac OS X

import numpy as np          
repeater = np.ctypeslib.load_library('librepeater.so', '.') 

Tuy nhiên, khi tôi biên dịch cùng một thư viện trên Mac OS X (Snow Leopard, 32 bit) và nhận repeater.dylib, và sau đó chạy sau trong Python:

import numpy as np         
repeater = np.ctypeslib.load_library('librepeater.dylib', '.') 

tôi nhận được lỗi sau:

OSError: dlopen(/mydir/librepeater.dylib, 6): no suitable image found. Did find: 
    /mydir/librepeater.dylib: mach-o, but wrong architecture 

Tôi có phải làm điều gì đó khác để tải thư viện động bằng Python trên Mac OS X không?

Trả lời

3

Không. Khi thông báo lỗi cho biết, có một kiến ​​trúc không khớp giữa tệp python của bạn và tệp librepeater.dylib. Sử dụng file để kiểm tra kiến ​​trúc của librepeater.dylib là gì; python của bạn sẽ được xây dựng bằng cách sử dụng một trong những người không được liệt kê.

+0

Sử dụng 'tệp' đã thực hiện thủ thuật: Tôi đã sửa đổi kiến ​​trúc trong cài đặt trình biên dịch để khớp với cài đặt python và giờ nó hoạt động. Cảm ơn! – nolk

+0

Bạn có đang sử dụng Python do Apple cung cấp không? Nếu vậy, bạn có thể vừa chạy ở chế độ 32 bit như được đề xuất. Nhưng cũng biên dịch lại các tác phẩm. Đây cũng là lý do tại sao các tệp nhị phân trên OS X thường được xây dựng dưới dạng tệp đa kiến ​​trúc (ví dụ: i386, x86_64 và ppc) để các tệp, libs hoặc ứng dụng có thể được sử dụng trên các loại máy khác nhau được hỗ trợ bởi cấp hệ điều hành . –

10

Nó không chỉ là một câu hỏi về những kiến ​​trúc có sẵn trong dylib; nó cũng là một vấn đề về kiến ​​trúc mà trình thông dịch Python đang chạy. Nếu bạn đang sử dụng Python 2.6.1 do Apple cung cấp trong OS X 10.6, theo mặc định nó chạy ở chế độ 64 bit nếu có thể. Vì bạn nói thư viện của mình đã được biên dịch dưới dạng 32 bit, bạn sẽ cần phải buộc Python chạy ở chế độ 32 bit. Đối với Python do Apple cung cấp, một cách để làm điều đó là đặt biến môi trường đặc biệt:

$ python -c "import sys; print sys.maxint" 
9223372036854775807 
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes 
$ python -c "import sys; print sys.maxint" 
2147483647 

Xem Apple man 1 python để biết thêm thông tin.

+0

+1, ngay trên mục tiêu. –

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