Передача непрозрачного указателя C ++ в Python с Boost.Python

Я работаю над расширением Python, используя Boost.Python. Расширение манипулирует непрозрачными указателями на структуру. У меня есть шаблон, где функция f определенный в C ++ вызывает функцию g определено в Python, который сам вызывает функцию h определено в C ++. f создает указатель на структурированный и передает его g, который передает его h,

Проблема: когда h называется, указатель другой.

Вот код расширения C ++:

#define BOOST_NO_AUTO_PTR
#include <boost/python.hpp>
#include <boost/python/return_opaque_pointer.hpp>
#include <boost/python/def.hpp>
#include <boost/python/module.hpp>
#include <boost/python/return_value_policy.hpp>
#include <string>
#include <iostream>

namespace bpl = boost::python;

struct test_struct {};

typedef test_struct* test_struct_handle;

static void h(test_struct_handle handle) {
std::cerr << "in h, handle address is " << (void*)handle << std::endl;
}

static void f(bpl::object obj, const std::string& method_name) {

struct test_struct my_struct;
test_struct_handle my_handle = &my_struct;
std::cerr << "in f, handle address is " << (void*)my_handle << std::endl;

try {
bpl::object fun = obj.attr(method_name.c_str());
bpl::object r = fun(my_handle);
} catch(const bpl::error_already_set&) {
PyErr_Print();
exit(-1);
}
}

BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(test_struct)

BOOST_PYTHON_MODULE(_test)
{
bpl::opaque<test_struct>();

bpl::def("f", &f);
bpl::def("h", &h);
}

А вот скрипт Python, который использует это расширение:

import _test

class A():
def g(self, handle):
_test.h(handle)

a = A()
_test.f(a,"g")

Вот пример результата:

in f, handle address is 0x7ffd4877a777
in h, handle address is 0x7f1c109bcc8000

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]