为什么PyObject_Print崩溃?
我最近在尝试使用Python 3.3的C接口,想看看能不能在我即将进行的项目中用上它,但没过多久就遇到了问题。
就连这么简单的代码也出现了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这个函数上,它引发了崩溃。我的代码或者设置哪里出了问题呢?
2 个回答
我在把一个C模块从Python 2.x迁移到3.x的时候,发现PyObject_Print()会崩溃。
首先,检查一下你C模块里的MS VS版本(MSC),确保它和Python报告的版本一致。
比如,运行python.exe会显示:
Python 3.3.2 (v3.3.2:d047928ae3f6, 2013年5月16日,00:03:43) [MSC v.1600 32位 (Intel)] 在win32上
在你模块的初始化函数里加一行代码:
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.c
link.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.c
link.exe /dll /out:smod.pyd smod.obj /LIBPATH:c:\python33\libs
这样就解决了问题!
这很可能是因为链接不正确导致的。当你代码中的 File*
和你链接的 Python 库中的 File*
不同的时候,崩溃就很常见。这种情况可能发生在你链接的库是用不同的编译器或者编译器的不同版本编译的,这样就会使用不同的运行时环境。