2011-03-15 11 views
7

저는 boost.python 라이브러리가있는 애플리케이션을 작성하고 있습니다. 나는 std::vector을 반환하는 파이썬으로 함수를 전달하고자합니다. 내가 파이썬에서 해당 함수를 호출 내가 얻을 때std :: vector를 내보내는 방법

inline std::vector<std::string> getConfigListValue(const std::string &key) 
{ 
    return configManager().getListValue(key); 
} 

BOOST_PYTHON_MODULE(MyModule) 
{ 
    bp::def("getListValue", getListValue); 
} 

:

TypeError: No to_python (by-value) converter found for C++ type: std::vector<std::string, std::allocator<std::string> > 

무엇 내가 놓친 좀 문제가?

당신은이 같은 변환기를 작성해야

답변

8

: 다음

template<class T> 
struct VecToList 
{ 
    static PyObject* convert(const std::vector<T>& vec) 
    { 
     boost::python::list* l = new boost::python::list(); 
     for(size_t i = 0; i < vec.size(); i++) { 
      l->append(vec[i]); 
     } 

     return l->ptr(); 
    } 
}; 

그리고 모듈에 등록 :

BOOST_PYTHON_MODULE(MyModule) 
{ 
    boost::python::to_python_converter<std::vector<std::string, std::allocator<std::string> >, VecToList<std::string> >(); 
    boost::python::def("getListValue", getListValue); 
} 
+0

많은 감사합니다. – Ockonal

+0

Btw, 왜'class'를'std :: allocator' 전에 작성 했습니까? – Ockonal

+1

.... 나는 정말로 모른다! 내가 그것을 제거하고 여전히 작동합니다. –

0

그것은 조금 오래된 질문이다,하지만 내가 찾은 것을 명시 적으로하는 경우 그래서 같은 값으로 반환 할 필요합니다

namespace bp = boost::python 

BOOST_PYTHON_MODULE(MyModule) 
{ 
    bp::def("getListValue", getListValue, 
      bp::return_value_policy<bp::return_by_value>()); 
}  

보다는

BOOST_PYTHON_MODULE(MyModule) 
{ 
    bp::def("getListValue", getListValue); 
} 

파이썬은 변환을 수행하며 (이 대답을 쓰는 시점에는 파이썬 2.7을 사용하고 있습니다.) 변환기를 선언하거나 정의 할 필요가 없습니다.

0

@Tryskele 나는 /에서 STL 컨테이너로 변환하는 유틸리티 함수를 다음 사용합니다. 사소한 합계 함수는 어떻게 사용되는지를 보여줍니다. 당신이 그것을 사용할 수 있기를 바랍니다.

#include <vector> 
#include <boost/python.hpp> 
#include <boost/python/object.hpp> 
#include <boost/python/stl_iterator.hpp> 

namespace bpy = boost::python; 

namespace fm { 

template <typename Container> 
bpy::list stl2py(const Container& vec) { 
    typedef typename Container::value_type T; 
    bpy::list lst; 
    std::for_each(vec.begin(), vec.end(), [&](const T& t) { lst.append(t); }); 
    return lst; 
} 

template <typename Container> 
void py2stl(const bpy::list& lst, Container& vec) { 
    typedef typename Container::value_type T; 
    bpy::stl_input_iterator<T> beg(lst), end; 
    std::for_each(beg, end, [&](const T& t) { vec.push_back(t); }); 
} 

bpy::list sum(const bpy::list& lhs, const bpy::list& rhs) { 
    std::vector<double> lhsv; 
    py2stl(lhs, lhsv); 

    std::vector<double> rhsv; 
    py2stl(rhs, rhsv); 

    std::vector<double> result(lhsv.size(), 0.0); 
    for (int i = 0; i < lhsv.size(); ++i) { 
    result[i] = lhsv[i] + rhsv[i]; 
    } 
    return stl2py(result); 
} 

} // namespace fm 

BOOST_PYTHON_MODULE(entry) 
{ 
    // intended to be fast math's fast sum :) 
    bpy::def("sum", &fm::sum); 
} 
관련 문제