2013-02-15 125 views
0

我一直在玩了Python 3.3 C-API,看看是否我可能在计划即将到来的项目中使用它,几乎立刻遇到了问题。PyObject_Print为什么会崩溃?

即使代码这个简单的崩溃,0000005作为回报:

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

+0

测试与Python 2.7的作品 - 如预期的输出和没有崩溃。你有没有把它链接到正确的库? – jogojapan 2013-02-15 05:16:46

+0

我敢肯定我,而我使用python 3.3 – 2013-02-15 05:30:54

+0

你包括正确Python.h – dmg 2013-02-18 14:42:28

回答

2

这最有可能是由于不正确的联动。崩溃是常见的,当您的代码中File*是你对链接蟒蛇的lib从File*不同。这可能发生在库所针对的库已经由不同的编译器或不同版本的编译器编译时使用不同的运行库。

+0

因此重新编译的Python? – 2013-02-22 22:26:16

+0

是的,应该解决问题。 – Thomas 2013-02-23 10:59:24

0

我已经PyObject_Print()崩溃,当我提出从Pyhton 2.x的一个C模块 - > 3.x的

首先,你的C模块中检查MS VS版本(MSC)的版本相匹配由Python报告。

例如,运行python.exe报告: 的Python 3.3.2(V3.3.2:d047928ae3f6,2013年5月16日,0时03分43秒)[MSC v.1600 32位(英特尔)]在Win32

将fprintf添加到模块的init函数中:

fprintf(stderr,“C - MSC_VER%d \ n”,_MSC_VER);

,并提供:

Ç - MSC_VER 1600

其次,检查你的命令行选项。 再次,对于我的简单测试模块的命令为:

cl.exe时/Fosmod.obj/C/I “%INCLUDE%”/ I C:\ python33 \包括smod.c LINK.EXE/DLL /出:smod.pyd smod.obj/LIBPATH:C:\ python33 \库

这些使我的模块中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

固定!