2011-11-22 36 views
7

進出口試圖從C代碼調用Python函數,以及i從跟隨herePython嵌入

一個樣本I也具有正確的包括文件directries,圖書館directries,和鏈接的python32.lib(使用python 32 IM)但錯誤的是,蟒蛇/ C API,如PyString_FromString,PyInt_FromLong,PyInt_AsLong是不確定的(在調試程序錯誤)

這很奇怪,因爲IM也使用其他的API,但他們都很好...

這裏有什麼問題?

int 
main(int argc, char *argv[]) 
{ 
    PyObject *pName, *pModule, *pDict, *pFunc; 
    PyObject *pArgs, *pValue; 
    int i; 

    if (argc < 3) { 
     fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); 
     return 1; 
    } 

    Py_Initialize(); 
    pName = PyString_FromString(argv[1]); 
    /* Error checking of pName left out */ 

    pModule = PyImport_Import(pName); 
    Py_DECREF(pName); 

    if (pModule != NULL) { 
     pDict = PyModule_GetDict(pModule); 
     /* pDict is a borrowed reference */ 

Py_Initialize(),PyImport_Import(),PyModule_GetDict()所有工作正常,但不是PyString_FromString ...

+2

我真的覺得功能PyString_FromString更名爲PyBytes_FromString到Python 3.x的 – Tarantula

回答

18

您使用的示例代碼是古老的Python版本,2.3.2。 Python 3.x版本不僅在語言中,而且在C API中引入了許多不兼容的內容。

你提到的函數在Python 3.2中不再存在。

PyString_功能被重命名爲PyBytes_

PyInt_功能不見了,應該用PyLong_代替。

下面是同樣的例子,你已經使用,但爲Python 3:

5.3. Pure Embedding

注意,它使用PyUnicode_代替PyString_/PyBytes_。在很多Python 2.x使用字節字符串的地方,Python 3.x使用unicode字符串。

順便說一句,我通常使用此頁面來查找所有可能的呼叫:

Index – P

+0

所以我跟隨你的建議,它的工作。現在我想用你提供的文檔示例來測試它。我是否進入.exe directry和cmd'調用multiply multiply 3 2'? – PeterG

+0

我認爲是的,是的,假設exe文件被稱爲'call'。如果您遇到問題,請提出一個單獨的問題。 – yak