Привязки Python к Libsvm: mach-o, но неправильная архитектура

Я пытаюсь установить libsvm на свой Mac (OS-X 10.6.8). Libsvm прекрасно устанавливается для C++ (я могу использовать бинарные файлы svm-train, svm-predict). В соответствии с инструкциями я набрал make в папке libsvm-3.12/python/ и получил следующий вывод:

<i>
make -C .. lib
if [ "Darwin" = "Darwin" ]; then \
        SHARED_LIB_FLAG="-dynamiclib -W1,-install_name,libsvm.so.2"; \
    else \
        SHARED_LIB_FLAG="-shared -W1,-soname,libsvm.so.2"; \
    fi; \
    g++ ${SHARED_LIB_FLAG} svm.o -o libsvm.so.2
</i>

Но когда я пытаюсь использовать его в python через «import svmutil», я получаю следующую ошибку

<i> 
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "svmutil.py", line 3, in <module>
    from svm import *
  File "svm.py", line 19, in <module>
    '../libsvm.so.2'))
  File "/Library/Frameworks/Python.framework/Versions/7.1/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(../libsvm.so.2, 6): no suitable image found.  Did find:
    ../libsvm.so.2: mach-o, but wrong architecture
</i>

Я не знаю, как обойти эту ошибку. Я также пытался скомпилировать с флагами -m64 и -arch x86_64 для g++ (во время процесса «Создать» libsvm), но я продолжаю получать эту ошибку. Может кто-нибудь, пожалуйста, скажите мне, как обойти эту проблему?


person abhijit bendale    schedule 24.09.2012    source источник
comment
Ваш Python 32-битный или 64-битный?   -  person nneonneo    schedule 25.09.2012


Ответы (1)


Попробуйте собрать libsvm как универсальный двоичный файл:

make CFLAGS='-arch i386 -arch x86_64' CXXFLAGS='-arch i386 -arch x86_64' LDFLAGS='-arch i386 -arch x86_64'

В качестве альтернативы убедитесь, что вы используете подходящую версию Python (проверьте баннер интерпретатора Python).

person nneonneo    schedule 24.09.2012
comment
Спасибо за ваш ответ. Только что понял, в чем дело. Мой питон по умолчанию был переключен на 32-битный (я установил пакет enthought scipy/numpy, во время которого он изменил версию моего питона на 32-битную). Когда я пробовал /usr/bin/python2.6 -c import svmutil, он работал отлично (/usr/bin/python2.6 — это 64-битный python). - person abhijit bendale; 25.09.2012
comment
Ваше предположение было правильным. Это была проблема 32-битного Python и 64-битного Python. - person abhijit bendale; 25.09.2012