importorror:动态模块没有定义init函数,但是它定义了

2024-06-28 19:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我试图为一个供应商C++库编写绑定。我已经成功地使用了下面这样的代码片段在其他模块中定义了in I t函数,但是在这个模块中似乎不起作用:它编译得很好,但是一旦我试图将importror导入到测试脚本中,它就会抛出importrorror。这里可能有什么问题?

#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC initclient(void) {

    PyObject* m;

    ClientType.tp_new = PyType_GenericNew;
    if (PyType_Ready(&ClientType) < 0)
        return;

    m = Py_InitModule3("client", client_methods, "Client module");
    Py_INCREF(&ClientType);
    PyModule_AddObject(m, "Client", (PyObject *) &ClientType);

}

这是在32位Linux上,带有gcc 4.4.4。


Tags: 模块函数代码inpyclient定义供应商
3条回答

我也有同样的问题。编译时:

  • Python头的路径:OK
  • Python库的路径:OK
  • 链接到Python库:OK
  • 链接到所需的第三方库/对象文件:确定

我忘了编译定义模块的C文件。。。叹息。。。

所以,首先要检查的是:makefile或编译命令!:)

我收到了同样的错误消息,但这是因为我重命名了.c文件,忘记更新代码中的名称。“initxxx”函数及其内部的参数。

确保不要混合使用Python版本。在Python版本2中,init函数被称为init_u,而在版本3中,这个函数被称为PyInit_u

在我的例子中,这发生在SWIG 3.0.2使用python3.4生成绑定时,而我的Python IDE调用了Python 2.7解释器。

您可以在生成的.cxx文件中看到差异:

#if PY_VERSION_HEX >= 0x03000000
#  define SWIG_init    PyInit__<modulename>

#else
#  define SWIG_init    init_<modulename>

#endif

在linux上,还可以使用以下命令检查.so导出:

nm -D <modulename> | grep <modulename>

这将给出库中init函数的名称。

相关问题 更多 >