2013-02-15 228 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

固定!