ImportError:动态模块没有定义init函数

时间:2015-01-20 08:38:12

标签: python c++

我正在尝试重现以下教程https://csl.name/post/c-functions-python/

C ++ 中的我的Python扩展名如下:

#include <Python.h>

static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
  char *s = "Hello from C!";
  return Py_BuildValue("s", s);
}

static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
  double x, y;
  PyArg_ParseTuple(args, "dd", &x, &y);
  return Py_BuildValue("d", x*y);
}

static PyMethodDef extPy_methods[] = {
  {"myFunction", py_myFunction, METH_VARARGS},
  {"myOtherFunction", py_myOtherFunction, METH_VARARGS},
  {NULL, NULL}
};

void initextPy(void)
{
  (void) Py_InitModule("extPy", extPy_methods);
}

我使用以下 setup.py

from distutils.core import setup, Extension
setup(name='extPy', version='1.0',  \
ext_modules=[Extension('extPy', ['extPy.cpp'])])

python setup.py install调用后,.so文件似乎在正确的位置。

但是当我尝试将此扩展名与import extPy一起使用时,我收到错误:

ImportError:动态模块未定义init函数

我在这里缺少什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:10)

因为函数initextPy是一个C ++函数,导致C ++编译器mangle the name,所以它不可识别。

您需要将函数标记为extern "C"以禁止名称修改:

extern "C" void initextPy(void)
{
    ...
}