Hi Paul, On Fri, Jun 1, 2012 at 1:41 PM, Paul Emsley <paul.ems...@bioch.ox.ac.uk> wrote: > > I've been trying to read boost python docs and I am lost... > > I'd like to return a PyObject *. I have a RDKit::RWMol, say - or a > pointer to a new one if need be...
If you are using a boost.python interface, and your function is exposed using boost::python::def, then the right thing happens more-or-less automatically if you have a function that returns an RDKit::RWMol *. I say more-or-less because you will probably also have to tell the library what to do about ownership of the pointer; you'll get a very informative compiler error here if you leave that out and it's required. Even if you're not using boost.python for the entire interface, it may be worth trying to use it for the functions where you want to return RDKit objects. I have no idea if this is possible, but it's worth a try. You'd do a function something like this: RDKit::ROMol * coot::regularize(RDKit::ROMol &mol) { .. do stuff .. // construct return value RDKit::RWMol *regularized_mol = new RDKit::RWMol(mol); update_coords(regularized_mol); // replace with refined positions return static_cast<ROMol *>(regularized_mol); } Notice how that has no reference to python objects in it; it's also conceivably useful from your C++ code. To expose to python, you have in the code for your wrapper module: boost::python::def("regularize",coot::regularize,(python::arg("mol")), "docs", boost::python::return_value_policy<boost::python::manage_new_object>()); This (obviously) isn't tested in any way, shape, or form. It probably also won't work unless the whole thing is inside a module that's set up using the BOOST_PYTHON_MODULE macro, but it's worth a try. Having said all of that: this is starting to move in a very highly specialized direction that's maybe not interesting to most of the readers of rdkit-discuss (though it's fascinating to me :-). I'd suggest moving this discussion to rdkit-devel. Paul: if the above doesn't work, please post something to rdkit-devel along with a short description of how you're creating your python modules (are you using SWIG? wrapping them by hand? already using Boost.Python?) and I'll try to help more. A pointer to actual code would also help. -greg > // return a regularized molecule (copy of input with coordinates replaced) > PyObject * > coot::regularize(PyObject *mol_in_py) { > > RDKit::ROMol &mol = > boost::python::extract<RDKit::ROMol&>(mol_in_py); // thanks Uwe H > .. do stuff .. > // construct return value > RDKit::RWMol *regularized_mol = new RDKit::RWMol(mol); // needs > boostifying? > update_coords(regularized_mol); // replace with refined positions > > return somehow_wrap(regularized_mol); > > } > > What is somehow_wrap()? What should I have read to find this out for > myself? > > Cheers, > > Paul. > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > Rdkit-discuss mailing list > Rdkit-discuss@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rdkit-discuss ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss