为啥 PyObject_Print 会崩溃?
Posted
技术标签:
【中文标题】为啥 PyObject_Print 会崩溃?【英文标题】:Why is PyObject_Print crashing?为什么 PyObject_Print 会崩溃? 【发布时间】:2013-01-31 01:33:02 【问题描述】:我一直在使用 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 正在生成崩溃。这段代码和/或我的设置有什么问题?
【问题讨论】:
使用 python 2.7 测试有效——按预期输出并且没有崩溃。您是否将其链接到正确的库? 我确定我有,而且我使用的是 python 3.3 您是否包含正确的 Python.h 【参考方案1】:这很可能是由于不正确的链接。当您的代码中的File*
与您链接的python 库中的File*
不同时,崩溃很常见。当喜欢的库由不同的编译器或不同版本的编译器编译时,可能会发生这种情况,这些编译器使用不同的运行时。
【讨论】:
【参考方案2】:当我从 Pyhton 2.x -> 3.x 移动 C 模块时,我的 PyObject_Print() 崩溃了
首先,检查你的 C 模块中的 MS VS 版本 (MSC) 是否与 Python 报告的版本匹配。
例如,运行 python.exe 报告: Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
将 fprintf 添加到模块的 init 函数中:
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
已修复!
【讨论】:
以上是关于为啥 PyObject_Print 会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章