【问题标题】: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

标签: c++ python python-3.x c-api


【解决方案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

    已修复!

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2011-04-17
      相关资源
      最近更新 更多