使用 c++ boost::python 从 python 函数返回的列表中获取数据?

Posted

技术标签:

【中文标题】使用 c++ boost::python 从 python 函数返回的列表中获取数据?【英文标题】:Get data from a list returned by a python function using c++ boost::python? 【发布时间】:2020-10-28 19:18:16 【问题描述】:

我有一个 python 函数返回一个浮点列表:

# Script.py
def get_double_list():
    data_list = []
    for a in range(5):
        data_list.append(float(a/10));
    return data_list

我想从 C++ 代码中调用它并从列表中获取数据。 我编写了以下 C++ 代码,但提取双打不起作用。 我做错了什么?

#define BOOST_AUTO_LINK_NOMANGLE
#include <boost/python.hpp>
#include <iostream>

namespace bp = boost::python;

int main(int argc, char** argv)


    Py_Initialize();
    boost::python::object main_module = boost::python::import("__main__");
    boost::python::dict main_namespace = boost::python::extract<boost::python::dict>(main_module.attr("__dict__"));

    exec_file("Script.py", main_namespace, main_namespace);

    boost::python::object global(main_module.attr("__dict__"));
    boost::python::object get_double_list = global["get_double_list"];

    if (!get_double_list.is_none())
    
        auto py_ex_list = bp::extract<bp::list>(get_double_list());
        if (py_ex_list.check())
        
            bp::list py_list = py_ex_list();
            Py_ssize_t list_len = bp::len(py_list);
            std::cout << "List length is: " << list_len << std::endl;
            for (Py_ssize_t i = 0; i < list_len; i++)
            
                auto item = py_list[i];
                auto d_ex = bp::extract<double>(item);
                double d = d_ex();
                std::cout << "Double = " << d << std::endl;
            
        
    
    return 0;

我知道它在某种程度上失败了

auto d_ex = bp::extract<double>(item);

(在 MS Windows 10、Boost 1.73.0、Python 3.8.5 上测试)

【问题讨论】:

【参考方案1】:

如果我将 data_list 更改为全局,它就可以工作

data_list = []

def get_double_list():
    global data_list
    for a in range(5):
        data_list.append(float(a/10));
    return data_list

【讨论】:

嗯,很烦人必须在 python 代码中进行调整,但很高兴你找到了解决方法。

以上是关于使用 c++ boost::python 从 python 函数返回的列表中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::python 从 c++ 函数访问大表

使用 boost::python 将回调从 python 传递到 c++

在 boost python 中暴露 C++ 接口

如何使用 Boost Python 从 C++ bool 转换为 Python boolean?

使用 c++ boost::python 从 python 函数返回的列表中获取数据?

使用 Boost Python 从 c++ 类创建派生的 Python 类