[C++-sig] Conversion from python objects to c++ objects for argument passing
Nicodemus
nicodemus at globalite.com.br
Fri Nov 29 23:25:09 CET 2002
I had checked the FAQ and tried this code before I posted earlier, but
it gave me the same result (the application locks in a loop in that same
line). Any other ideas of what maybe wrong?
Thanks for your reply Ralf,
Bruno da Silva de Oliveira.
Ralf W. Grosse-Kunstleve wrote:
>I don't know what is wrong with your code specifically, but you are using a
>lvalue converter where you should be using a rvalue converter anyway. lvalue
>converters are suitable only for accessing exisiting objects directly. You are
>creating a new object, as a static object. This is not thread-safe and in all
>likelihood has other drawbacks.
>For more information please refer to the
>
>How can I wrap functions which take C++ containers as arguments?
>
>section at
>
>http://www.boost.org/libs/python/doc/v2/faq.html
>
>You may copy container_conversions.h to your own include tree. Include the file
>in your extension module and then:
>
> scitbx::boost_python::container_conversions::from_python_sequence<
> std::vector<int>,
> scitbx::boost_python::container_conversions::variable_capacity_policy>();
>
>This should be all you need.
>Ralf
>
>--- Nicodemus <nicodemus at globalite.com.br> wrote:
>
>
>>Hail!
>>
>>First, let me congratulate everyone involved in Boost.Python. The more
>>you use it, the more you see how great the library is!
>>
>>I'm having a little problem though. I want that the following function:
>>
>>void PrintVec( const vector<int> &v )
>>{
>> vector<int>::const_iterator it = v.begin();
>> stringstream ss;
>> ss << "C++: [";
>> while ( it != v.end() ){
>> if ( it != v.begin() ){
>> ss << ", ";
>> }
>> ss << *it;
>> }
>> ss << "]";
>> cout << ss.str() << endl;
>>}
>>
>>Be called like this from python:
>>
>> >>> PrintVec([1,2,3])
>>C++: [1, 2, 3]
>>
>>To accomplish that, I've been using this lvalue converter:
>>
>>struct pylist_to_vector
>>{
>> static vector<int>& execute(PyObject& o)
>> {
>> static vector<int> v;
>> v.clear();
>> cout << "execute" << endl;
>> if ( PyList_Check(&o) ){
>> int size = PyList_Size(&o);
>> cout << "size is " << size << endl;
>> v.reserve( size );
>> for( int i = 0; i < size; ++i ){
>> PyObject* item = PyList_GetItem(&o, i);
>> if ( PyInt_Check(item) ){
>> int num = PyInt_AsLong(item);
>> v.push_back( num );
>> }
>> else {
>> cout << "Not a num at: " << i << endl;
>> }
>> }
>> }
>> cout << "returning..." << endl;
>> return v;
>> }
>>};
>>
>>and in the module definition:
>>
>>BOOST_PYTHON_MODULE(test)
>>{
>> lvalue_from_pytype<pylist_to_vector, &PyList_Type>();
>> def( "PrintVec", &PrintVec );
>>}
>>
>>Everything links and compiles without a problem. But, when I execute:
>> >>> PrintVec([1,2,3])
>>execute
>>size is 3
>>returning...
>>
>>in python, it enters in an infinite loop and never stops. Debugging, I
>>found out that it enters into my function, exits it, goes through
>>boost.python, until it enters this code:
>>
>>/* file returning.hpp, line 114
>>template<class P BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class A)>
>>static PyObject* call(
>> R (*pf)(BOOST_PP_ENUM_PARAMS_Z(1, N, A))
>> , PyObject* args_
>> , PyObject*, P const* policies)
>> {
>> // check that each of the arguments is convertible
>> BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_CHECK_CONVERSION, nil)
>>
>> if (!policies->precall(args_))
>> return 0;
>> (*pf)(BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_CALL_ARGS, nil));
>> return policies->postcall(args_, detail::none());
>> }
>>
>>In the "return 0;" line, the processor hits 100% and the application blocks.
>>
>>So, what am I doing wrong? Is this the right way to accomplish what I
>>want? I'm using Intel C++ 6 with STLport on windows.
>>
>>Thanks for any hints and comments,
>>Bruno da Silva de Oliveira.
>>
>>
>
>
>__________________________________________________
>Do you Yahoo!?
>Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
>http://mailplus.yahoo.com
>
>_______________________________________________
>C++-sig mailing list
>C++-sig at python.org
>http://mail.python.org/mailman/listinfo/c++-sig
>
>
>
More information about the Cplusplus-sig
mailing list