【问题标题】:ImportError: dynamic module does not define init functionImportError:动态模块未定义初始化函数
【发布时间】:2015-03-18 09:57:36
【问题描述】:

我正在尝试重现以下教程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: 动态模块没有定义初始化函数

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

【问题讨论】:

    标签: python c++


    【解决方案1】:

    因为函数 initextPy 是一个 C++ 函数,它会导致 C++ 编译器为 mangle the name,因此无法识别。

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

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

    【讨论】:

    • 这完成了工作。谢谢。
    猜你喜欢
    • 2017-07-21
    • 2015-09-22
    • 2020-10-27
    • 2011-02-02
    • 2011-06-29
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多