当前位置: 首页 > 面试题库 >

CPP中嵌入的Python:如何将数据返回CPP

仇征
2023-03-14
问题内容

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

中嵌入Python代码。

C ++代码如下所示:

#include <string>
#include <iostream>
#include <boost/python.hpp>

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<std::string>(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’执行正常,我可以看到’result’的打印。我不能做的是从C
++代码中读取“结果”。extract命令永远不会在任何名称空间中找到“结果”。我尝试将“结果”定义为全局变量,甚至尝试返回一个元组,但无法使其正常工作。


问题答案:

首先,将函数更改return为值。print这样做会使事情变得复杂,因为您想找回价值。假设您的MyModule.py样子是这样的:

import thirdparty

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

现在,要执行所需的操作,就必须超越文档的基本嵌入。这是运行您的功能的完整代码:

#include <Python.h>

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;
}


 类似资料:
  • 问题内容: 我有一个由javascript函数填充的html表单。我还有另一个javascript函数,可获取所有表单元素的值,并且当前仅使用警报将其显示给用户。通过python使用以下代码显示html页面: 这一切都很好,但是我不想使用警报来显示数据,而是想将数据传递回python,但不知道如何。所有数据都存储在javascript数组中,因此我基本上只需要传递这一数据即可。 编辑:我不能使用任

  • 我已经使用laravel雄辩的方法在db中插入了一行。参见下面的代码, 我希望从表中插入最后一行,但我的响应包含空数据。请指导获取数据的正确方法?

  • 问题内容: 我有两个用Java编写的应用程序,它们通过网络使用XML消息相互通信。我在接收端使用了SAX解析器,以从消息中获取数据。要求之一是将二进制数据嵌入XML消息中,但是SAX不喜欢这样。有谁知道如何做到这一点? 问题答案: XML是如此多才多艺… XML就像暴力-如果它不能解决问题,则说明你使用的不够多。 编辑: 顺便说一句:Base64 + CDATA可能是最好的解决方案

  • 问题内容: 我有一个对快速服务器(我自己的服务器)进行反应的组件。服务器用于在上签署交易。一旦将交易包含在一个块中,就将一个对象返回给服务器。看起来像这样: 我需要将存入上述组件的状态。我已经搜索了2天,可能丢失了一些非常明显的内容。 这是服务器端代码还是客户端代码?由于与之交谈的固有时间延迟,我是否需要学习和使用异步? 任何帮助表示赞赏! 谢谢 问题答案: 要发出发布请求,您必须通过compon

  • 问题内容: 我需要兑现承诺,以便可以通过封闭函数将其返回。我知道,由于正常的JavaScript范围,我可能无法按照编码的方式进行操作。有什么办法可以做到吗? 位于#1 的 console.log 会生成正确的数据。 console.log #2总是产生’a’; 任何指针将不胜感激。 问题答案: 许诺背后的基本原则之一是它是异步处理的。这意味着您无法创建承诺,然后立即在代码中同步使用其结果(例如,

  • 问题内容: Python中如何将输入数据转换为数字? 问题答案: Python 2.x 有两个函数用于获取用户输入,分别称为和。它们之间的区别是,不评估数据并以字符串形式原样返回。但是,将对你输入的内容进行评估,评估结果将返回。例如, 5 + 17评估数据,结果为22。当它对表达式求值时5 + 17,它将检测到你要添加两个数字,因此结果也将是同一int类型。因此,类型转换是免费完成的,并22作为的