我正在开始用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'])])
您是针对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。在
相关问题 更多 >
编程相关推荐