无法导入使用SWIG创建的模块

时间:2015-02-18 14:24:44

标签: python swig python-3.4 python-extensions

我正在尝试构建python扩展。我创建了导出单一功能的简单库。它只是一个文件 - testlib.c,它实现了名为' apicall'的功能。然后我创建了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

1 个答案:

答案 0 :(得分:3)

在Python 3.2中删除了CObject API。它被替换为Capsule API,它也适用于Python 2.7和3.1。

您使用的旧版SWIG将使用Python 3.4没有的CObject API生成代码,因此在导入时会导致错误并且python无法找到函数PyCObject_FromVoidPtr

解决方案是使用SWIG&gt; = 2.0.4版本为Python 3.2及更高版本生成代码。

来自SWIG Changelog

  

版本2。0。4(2011年5月21日)

     

2011-04-09:szager
  [Python]应用补丁#1932484:将PyCObject迁移到PyCapsule。