我一直在玩Python 3.3 C-API,看看我是否可以在计划中的即将到来的项目中使用它,但几乎马上就遇到了问题。
即使是这样简单的代码也会以0xc0000005作为返回崩溃:
#include <Python.h>
#include <cstdio>
int main(){
Py_Initialize();
Py_IncRef(Py_True); //just in case?
PyObject_Print(Py_True,stdout,Py_PRINT_RAW);
Py_DecRef(Py_True);
Py_Finalize();
return 0;
}
测试显示PyObject_Print正在生成崩溃。这个代码和/或我的设置有什么问题?
这很可能是由于不正确的链接造成的。当代码中的File*
与链接的python库中的File*
不同时,崩溃很常见。当使用不同运行时的不同编译器或不同版本的编译器编译了所喜欢的库时,就会发生这种情况。
当我从Pyhton 2.x->3.x 移动一个C模块时,PyObject_Print()崩溃了
首先,检查C模块中的MSVS版本(MSC)是否与Python报告的版本匹配。
例如,运行python.exe报告:Python 3.3.2(v3.3.2:d047928ae3f6,2013年5月16日,00:03:43)[MSC v.1600 32位(英特尔)]在win32 上
在模块的init函数中添加fprintf:
fprintf(stderr,"C-MSC_VER%d\n",_MSC_VER);
给予:
C-MSC_VER 1600
其次,检查您的命令行选项。同样,我的简单测试模块的命令是:
cl.exe/Fosmod.obj/c/I"%INCLUDE%"/I c:\python33\INCLUDE smod.clink.exe.dll/out:smod.pyd smod.obj/LIBPATH:c:\python33\libs
这些导致我的模块在PyObject_Print()中崩溃!
快速阅读"cl"命令行选项,我添加了"/MD":
cl.exe/MD/Fosmod.obj/c/I"%INCLUDE%"/I c:\python33\INCLUDE smod.clink.exe.dll/out:smod.pyd smod.obj/LIBPATH:c:\python33\libs
修复!