我正在尝试重现以下教程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函数
我在这里缺少什么?谢谢你的帮助。
答案 0 :(得分:10)
因为函数initextPy
是一个C ++函数,导致C ++编译器mangle the name,所以它不可识别。
您需要将函数标记为extern "C"
以禁止名称修改:
extern "C" void initextPy(void)
{
...
}