当前位置:  开发笔记 > 编程语言 > 正文

嵌入在CPP中的Python:如何将数据恢复到CPP

如何解决《嵌入在CPP中的Python:如何将数据恢复到CPP》经验,为你挑选了1个好方法。

在从事C++项目时,我一直在寻找第三方库,而不是我的核心业务.我发现了一个非常好的库,完全可以满足需要,但它是用Python编写的.我决定尝试使用Boost.Python库在C++中嵌入Python代码.

C++代码看起来像这样:

#include 
#include 
#include 

using namespace boost::python;

int main(int, char **) 
{
    Py_Initialize();

    try 
    {
        object module((handle<>(borrowed(PyImport_AddModule("__main__")))));

        object name_space = module.attr("__dict__");
        object ignored = exec("from myModule import MyFunc\n"
                          "MyFunc(\"some_arg\")\n",
                          name_space);

        std::string res = extract(name_space["result"]);
    } 
    catch (error_already_set) 
    {
        PyErr_Print();
    }

    Py_Finalize();
    return 0;
}

(非常)简化版本的Python代码如下所示:

import thirdparty

def MyFunc(some_arg):
    result = thirdparty.go()
    print result

现在的问题是:'MyFunc'执行正常,我可以看到'结果'的打印.我不能做的是从C++代码中读取'结果'.extract命令永远不会在任何命名空间中找到"结果".我尝试将'结果'定义为全局,我甚至尝试返回一个元组,但我无法让它工作.



1> nosklo..:

首先,将您的函数更改return为值.print因为你想要获得价值,所以会使事情复杂化.假设您的MyModule.py样子如下:

import thirdparty

def MyFunc(some_arg):
    result = thirdparty.go()
    return result

现在,要做你想做的事,你必须超越基本的嵌入,正如文档所说.以下是运行您的函数的完整代码:

#include 

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

    Py_Initialize();
    pName = PyString_FromString("MyModule.py");
    /* Error checking of pName left out as exercise */

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

    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, "MyFunc");
        /* pFunc is a new reference */

        if (pFunc) {
            pArgs = PyTuple_New(0);
            pArg = PyString_FromString("some parameter")
            /* pArg reference stolen here: */
            PyTuple_SetItem(pArgs, 0, pArg);
            pResult = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pResult != NULL) {
                printf("Result of call: %s\n", PyString_AsString(pResult));
                Py_DECREF(pResult);
            }
            else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                return 1;
            }
        }
        else {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function");
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }
    else {
        PyErr_Print();
        fprintf(stderr, "Failed to load module");
        return 1;
    }
    Py_Finalize();
    return 0;
}

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有