为什么PyObject_Print会崩溃?

时间:2013-02-15 05:03:12

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

我一直在使用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正在生成崩溃。这段代码和/或我的设置有什么问题?

2 个答案:

答案 0 :(得分:3)

这很可能是由于链接不正确造成的。当代码中的File*与您链接的python库中的File*不同时,崩溃很常见。当喜欢的库由不同的编译器或使用不同运行时的编译器的不同版本编译时,可能会发生这种情况。

答案 1 :(得分:0)

当我从Pyhton 2.x移动C模块时,我遇到PyObject_Print()崩溃 - &gt; 3.X

首先,检查C模块中的MS VS版本(MSC)是否与Python报告的版本匹配。

例如,运行python.exe报告: win32上的Python 3.3.2(v3.3.2:d047928ae3f6,2013年5月16日,00:03:43)[MSC v.1600 32位(英特尔)]

将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

固定!