Hello to everyone. I'm trying to write "from Python" converters for PETSc objects of the petsc4py package. Even if no-one of you uses petsc4py, I think you can help me, if I explain some basics. Please, be patient.
I want to make converters for the PETSc Mat type. Mat is defined as below: typedef struct _p_Mat* Mat; where _p_Mat is a structure whose details are not interesting for my problem. Now, I managed to make a functioning "to Python converter". My problem is the "from Python converter". I made a test function void print_Mat(Mat m) { ... // The implementation is not interesting }; And I tried to make a "from Python converter" with the code below (please, look at it ... it's not too long and it's very simple): struct PETSc_Mat_from_Python { PETSc_Mat_from_Python() { static bool do_registration(true); if (do_registration) { boost::python::converter::registry::push_back( &convertible,&construct,boost::python::type_id<Mat>()); do_registration = false; } } static void* convertible(PyObject* obj_ptr) { // In the line below, PyPetscMat_Get takes a PyObject* as input and returns a Mat // (if it succedes) or a PETSC_NULL (if it fails). This is a function of the petsc4py C API. // The ownership of the returned Mat is not transferred (I think) if (PyPetscMat_Get(obj_ptr) == PETSC_NULL) return NULL; return obj_ptr; } static void construct(PyObject* obj_ptr, boost::python::converter::rvalue_from_python_stage1_data* data) { void* storage = ( (boost::python::converter:: rvalue_from_python_storage<Mat>*)data)->storage.bytes; data->convertible = storage; // NOTE: The instruction below does not transfer ownership, but this is not my problem, for now new (storage) Mat(PyPetscMat_Get(obj_ptr)); } }; Then, obviously ... BOOST_PYTHON_MODULE(petsc_ext) { ... some not important lines ... PETSc_Mat_from_Python(); // Registers the converter def("print_Mat",print_Mat); } The code compiles without errors. The problem is that when calling "print_Mat" from the Python shell, the interpreter gives the error: print_Mat(m) # where m was previously and correctly built from Python and it is a Python object containing a Mat Traceback (most recent call last): File "<stdin>", line 1, in ? Boost.Python.ArgumentError: Python argument types in petsc_ext.print_Mat(petsc4py.PETSc.Mat) did not match C++ signature: print_Mat(_p_Mat*) I tried also to modify "void print_Mat(Mat m)" into "void print_Mat(const Mat m)" or "void print_Mat(const Mat& m)", but the result is the same. I tried also to debug the code, but the debugger does not enter into the "convertible" method, so I guess there is something wrong that I can't see. So may be I am missing something for the process of writing a "from Python converter" for pointer arguments. Can anyone help me, please ? -- Michele De Stefano http://www.linkedin.com/in/micdestefano _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig