为啥 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 会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ChangeWindowMessageFilter 会导致 Qt 崩溃?

为啥在使用 CAGradientLayer 时应用会崩溃

为啥这个程序会崩溃? [关闭]

为啥这个 Ext.grid.Panel 会崩溃?

为啥这个递归会崩溃?

NSMutableArray,removeFromArray 和 release,为啥会崩溃?