2014-03-19 31 views
2

我只能找到python 2的教程和鏈接,而不是3中的任何一個。 自2以來,很多函數都發生了變化,教程不再有效。如何在C++中正確加載python(3.0)函數

我能夠從另一個問題#1藉此,它似乎是最接近的工作。

char *my_result = 0; 
PyObject *module = 0; 
PyObject *result = 0; 
PyObject *module_dict = 0; 
PyObject *func = 0; 
PyObject *pArgs = 0; 

module = PyImport_ImportModule("testPython"); 
if (module == 0) 
{ 
    PyErr_Print(); 
    printf("Couldn't find python module"); 
} 
module_dict = PyModule_GetDict(module); 
func = PyDict_GetItemString(module_dict, "helloWorld"); 

//result = PyObject_CallObject(func, NULL); 
result = PyEval_CallObject(func, NULL); 
my_result = PyBytes_AsString(result); 
my_result = strdup(my_result); 

但my_result輸出0000.並且當使用斷點它說它無法讀取內存。

+0

什麼是不工作?是否有錯誤消息?編譯時?運行? – mgilson

+0

@mgilson我更新了我的底部問題。 「但my_result輸出0000,並使用斷點,它說,它無法讀取內存的時候。」 – user3436172

+0

錯誤處理101:1),檢查返回值2)如果事情無法恢復情況,不要繼續。 –

回答

1

試試這個:

static float CallPythonFunc() 
{ 
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pArgs; 
    float ret; 

    Py_Initialize(); 

    pName = PyBytes_FromString("py"); 

    pModule = PyImport_ImportModule("py"); 

    pDict = PyModule_GetDict(pModule); 

    pFunc = PyDict_GetItemString(pDict, "add"); 


    if (PyCallable_Check(pFunc)) 
    { 
     pArgs = PyTuple_New(2 /*number of arguments*/); 

     // Argument 1 
     pValue = PyFloat_FromDouble((double)5); 
     PyTuple_SetItem(pArgs, 0, pValue); 

     // Argument 2 
     pValue = PyFloat_FromDouble((double)6); 
     PyTuple_SetItem(pArgs, 1, pValue); 

     pValue = PyObject_CallObject(pFunc, pArgs); 

     ret = (float)PyFloat_AsDouble(pValue); 

    } 
    Py_Finalize(); 

    return ret; 
}