c++ - 将指针从 C++ 传递到 Python/w boost python?

标签 c++ python boost boost-python

我正在使用 Boost Python,我在 C++ 中生成了一个大的整数 vector ,我想在 Python 中访问这个 vector 而不复制它。

在 C++ 中我有:

BOOST_PYTHON_MODULE(myModule)
{
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>());
    def("ReturnVectorPtr", ReturnVectorPtr, return_value_policy<manage_new_object>());
}

vector<int>* ReturnVectorPtr()
{
    return new vector<int>();
}

然后在 python 中我有:

import myModule
myModule.ReturnVectorPtr()

这会导致 Python 崩溃,尽管我什至没有存储返回值。关于我的错误是什么有什么想法吗?

编辑:

以下代码可用于将 vector 中的数据从 C++ 获取到 Python,但会泄漏内存。 vector 是否被复制然后未被释放?

在 C++ 中:

BOOST_PYTHON_MODULE(myModule)
{
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>());
    def("ModifyVectorInPlace", ModifyVectorInPlace);
}

void ModifyVectorInPlace(vector<int>& data)
{
    // Modify data...
    return;
}

然后在 python 中我有:

import myModule
vectorInt = myModule.vectorInt()
myModule.ModifyVectorInPlace(vectorInt)

这是怎么回事?

编辑 2:

我从这里尝试了“原始 C++ 指针”示例,完全按照写的那样: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers

它也崩溃了。由于某种原因,我似乎无法获得指向传递给 Python 的任何内容的指针...

编辑 3:

崩溃似乎是来自 invoke.hpp 的段错误,在此函数中:

template <class RC, class F BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class AC)>
inline PyObject* invoke(invoke_tag_<false,false>, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) )
{
    return rc(f( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac, () BOOST_PP_INTERCEPT) ));
}

最佳答案

原来这是Mingw-w64和Python交互的一个bug。我执行了此处描述的过程并解决了问题:

http://ascend4.org/Setting_up_a_MinGW-w64_build_environment#Setup_Python_for_compilation_of_extensions

关于c++ - 将指针从 C++ 传递到 Python/w boost python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18646694/

相关文章:

c++ - 将 "pointer to data"转换为 "pointer to function"

c++ - 是否可以将数据作为 initializer_list 传递给 std::array 结构?

python - 使用 xlwings 操作用户表单

python - 如何防止 ImageChops.offset 包装数据?

c++ - 将 boost::chrono::steady_clock::time_point 转换为 std::chrono::steady_clock::time_point

c++ - 将包含多个数字的字符串转换为整数

C++:内联函数和链接时间代码生成

python - 实现需要多层关系的 django 模型的最佳方法

c++ - 如何使用 bjam 构建 boost 示例?

c++ - 如何在boost共享内存中直接写入opencv cv::Mat图像