C Python模块导入错误:未找到符号:_Py_InitModule4_64

2024-04-20 01:16:11 发布

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

我正在开始用C编写Python3模块的过程。我编写的C已经编译得很好了(我在文章的底部编译了代码)。我用以下方法编译:

python3 setup.py build_ext --inplace

生成的.so文件放在当前目录中。在启动python3之后,当我导入我的模块时,我得到了这个错误(用于截断路径的三个点):

^{pr2}$

如何实现symbol\u Py_InitModule4_64?在

如果这有什么意义的话,我在管理马科斯山脉


运行nmfor地狱世界.cpython-3600万-达尔文。所以显示未定义_Py_InitModule4_64,这是否证明编译过程中存在问题?在

nm helloWorld.cpython-36m-darwin.so 
                 U _Py_BuildValue
                 U _Py_InitModule4_64
0000000000000eb0 t _helloWorld
0000000000001060 d _helloWorld_docs
0000000000001020 d _helloworld_funcs
0000000000000e80 T _inithelloWorld
                 U dyld_stub_binder

代码

试验c:

#include <Python/Python.h>

static PyObject* helloWorld(PyObject* self) {
   return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloWorld_docs[] =
   "helloWorld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
   {"helloWorld", (PyCFunction)helloWorld,
   METH_NOARGS, helloWorld_docs},
   {NULL}
};

void inithelloWorld(void) {
   Py_InitModule3("helloworld", helloworld_funcs, "Extension module example!");
}

在设置.py公司名称:

from distutils.core import setup, Extension

setup(name = 'helloWorld', version = '1.0', \
    ext_modules = [Extension('helloWorld', ['test.c'])])

Tags: 模块代码pydocs过程setupextensionstatic
1条回答
网友
1楼 · 发布于 2024-04-20 01:16:11

您是针对Python2CAPI编写的模块(the various ^{} functions纯粹是针对Python2编写的),但您试图编译它并用Python3运行它。CPython的C层在python2和python3之间改变了一个lot,据我所知,C代码没有2to3工具。在

您需要编写python3api兼容的代码才能在python3上工作;最简单的(也是3.0-3.4支持的唯一方法)转换是single-phase initialization(使用PyModule_Create),但是{a3}的行为更像Python中定义的模块(例如,可以以单阶段模块不可能的方式完全卸载它们)。入口点名称的结构也发生了变化,从initMODULENAME更改为PyInit_MODULENAME,因此您还需要更新它。在

我强烈推荐阅读the Python 3 extension module tutorial。在

相关问题 更多 >