Greetings,

I'm new to Boost.Python. I have a C++ library (written and shipped by
another party) that I want to wrap into Python modules so that I can use
several functions in Python. One function takes an argument that is a C++
template vector. How can I export this function to a python function?

In a nutshell, here is what I'm doing now but without luck. I wrap the
template vector into a Python class using
Boost.Python's vector_indexing_suite. Then in the Python script, I first
declare this Python class and then pass it to the function. But I got no
luck and the following error message,

"
Boost.Python.ArgumentError: Python argument types in
    canupo.read_msc_header(MSCFile, FloatVec, int)
did not match C++ signature:
    read_msc_header(MSCFile {lvalue}, std::vector<float,
std::allocator<float> > {lvalue}, int {lvalue})
"

More specifically, here are the C++ code and Python script I have.

In the C++ library code file "helper.hpp", it has a struct MSCFile and a
function read_msc_header.

struct MSCFile
{
  // definition of MSCFile
};

int read_msc_header(MSCFile& mscfile, std::vector<FloatType>& scales, int&
ptn)
{
  // implementation of read_msc_header
}

The "FloatType" is just a alias for float.

In the C++ wrapper code file "wrapper.cpp"
#include "helpers.hpp"
#include <boost/python.hpp>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/implicit.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>

BOOST_PYTHON_MODULE(canupo)
{
  using namespace boost::python;

  class_<std::vector<FloatType> >("FloatVec")
    .def(vector_indexing_suite<std::vector<FloatType> >())
    ;

  class_<MSCFile>("MSCFile", init<const char*>())
    ;

  def("read_msc_header", read_msc_header);
}

In the python script, I tried to use the function as following but failed.

import canupo
mscfile = canupo.MSCFile("msc_file_name")
scales = canupo.FloatVec()
ptnparams = 0
print canupo.read_msc_header(mscfile, scales, ptnparams)

And the error goes like this:

Boost.Python.ArgumentError: Python argument types in
    canupo.read_msc_header(MSCFile, FloatVec, int)
did not match C++ signature:
    read_msc_header(MSCFile {lvalue}, std::vector<float,
std::allocator<float> > {lvalue}, int {lvalue})

I googled around but didn't find a good solution or a solution that I can
understand well. Most requires rewrite the function with Boost.Python. But
I don't want to change the C++ library code itself. I think there may be a
good way to expose such a function to Python. Thanks a lot!

Zhan.

-- 
Zhan Li, 李展;
Earth & Environment, Boston University, USA;

2008 - 2011, in Chinese Academy of Sciences, China;
2004 - 2008, in Nanjing University, China;
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
https://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to