Я работаю над расширением 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
Задача ещё не решена.
Других решений пока нет …