提升Python,python函数和ptrs

时间:2013-11-11 22:18:20

标签: c++ python pointers boost boost-python

我的共享库中有一个函数指针,用于调用主引擎。 (效果很好):func_ptr

我还有一个python模块,我在程序中导入,使用boost :: python :: import(“module”)

我的python模块中的一个函数:

def wrapper(function):
    function('TEST ')

和我的c ++程序中的一个函数:

int function(char const *msg){
{
    func_ptr(msg); //this line crashes
    return 1;
}

当我用

调用我的包装函数时
module.attr("wrapper")(boost::python::make_function(function))

它在我的c ++函数中崩溃了。 (段错误)

gdb产生类似的东西:

http://pastebin.com/NRdupqp6

如何使它有效? Ty!

1 个答案:

答案 0 :(得分:0)

如果在调用函数指针function()时在func_ptr中发生崩溃,则执行已经通过Boost.Python层。考虑:

  • 验证func_ptr是否指向有效功能。
  • 测试func_ptr指向的函数是否正确处理参数值"TEST "

使用module.py

def wrapper(function):
   return function('TEST ')

main.cpp

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

void engine(const char* msg)
{
  std::cout << "engine: " << msg << std::endl;
}

void (*func_ptr)(const char* msg) = &engine;

int function(const char* msg)
{
  func_ptr(msg);
  return 42;
}

int main()
{
  Py_Initialize();

  namespace python = boost::python;
  try
  {
    // Import the 'module' module.
    python::object module = python::import("module");

    // Invoke the wrapper function in the module, providing function
    // as a callback.
    python::object result = 
        module.attr("wrapper")(python::make_function(&function));

    std::cout << "result: " << python::extract<int>(result) << std::endl;
  }
  catch (python::error_already_set&)
  {
    PyErr_Print();
  }
}

应用程序产生以下输出:

engine: TEST 
result: 42