2015-02-18 2 views
3

Я пытаюсь построить расширение python. Я создаю простую библиотеку, которая экспортирует одну функцию. Это всего лишь один файл - testlib.c, который реализует функцию под названием apicall. Затем я создаю SWIG интерфейс файла:Не удается импортировать модуль, созданный с помощью SWIG

%module testlibpy      
void apicall(const char* message); 

Затем я использую эту команду для создания интерфейса: swig -python -py3 -modern testlibpy.i

Мой setup.py выглядит следующим образом:

from distutils.core import setup, Extension 


example_module = Extension('_testlibpy', 
          sources=['testlibpy_wrap.c', 'testlib.c'],) 

setup (name = 'testlibpy', 
     version = '0.1', 
     author  = "SWIG Docs", 
     description = """Simple swig example from docs""", 
     ext_modules = [example_module], 
     py_modules = ["testlibpy"], 
    ) 

Я строю расширение с помощью команды : python3.4 ./setup.py build_ext --inplace. Все работает нормально. Когда я пытаюсь импортировать мое новое расширение от python3.4 командной строки, я получить следующее сообщение об ошибке:

Python 3.4.2 (default, Feb 18 2015, 04:50:08) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import testlibpy 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File ".../sandbox/swigtest/testlibpy.py", line 24, in <module> 
    _testlibpy = swig_import_helper() 
    File ".../sandbox/swigtest/testlibpy.py", line 20, in swig_import_helper 
    _mod = imp.load_module('_testlibpy', fp, pathname, description) 
    File ".../swt/install/python-3.4.2/lib/python3.4/imp.py", line 243, in load_module 
    return load_dynamic(name, filename, file) 
ImportError: .../sandbox/swigtest/_testlibpy.cpython-34m.so: undefined symbol: PyCObject_FromVoidPtr 
>>> 

Все отлично работает для других версий Python - 2.7 и 3.0. Версия SWIG 1.3.40

+0

Какая версия SWIG вы используете? –

+0

Я использую 1.3.40. На другой машине с swig 2.0 все работает неплохо. – Lazin

ответ

3

В Python 3.2 удален CObject API. Он был заменен на Capsule API, который также доступен для Python 2.7 и 3.1.

Старая версия SWIG, которую вы используете, будет генерировать код с использованием API-интерфейса CObject, который не существует у Python 3.4, поэтому он вызывает ошибку при импорте, а python не может найти функцию PyCObject_FromVoidPtr.

Решение состоит в использовании версии SWIG> = 2.0.4 для генерации кода для Python 3.2 и выше.

От SWIG Changelog

Version 2.0.4 (21 May 2011)

2011-04-09: szager
[Python] Applied patch #1932484: migrate PyCObject to PyCapsule.

 Смежные вопросы

  • Нет связанных вопросов^_^