如何在c ++中正确加载python(3.0)函数

时间:2014-03-19 06:03:08

标签: python c++

我只能找到python 2的教程和链接,而不是3。 自2以来,许多功能都发生了变化,教程不再有效。

我能够从另一个Stackoverflow问题中得到这个,它似乎是最接近工作的。

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.当使用断点时,它表示它无法读取内存。

1 个答案:

答案 0 :(得分: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;
}