1

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

4

2 回答 2

4

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

于 2013-02-18T19:09:12.740 回答
0

当我从 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 \库

固定的!

于 2013-10-29T17:21:28.893 回答