[C++-sig] sending a c++ class to a python function
Josh Stratton
strattonbrazil at gmail.com
Mon Aug 29 05:22:49 CEST 2011
I'm getting an error when I try to pass down my object that results in
a seg fault. I've registered my class I'm sending down, but when I
actually send it, my program exits at this line in the library right
after I call the importFile() function...
return call<obj>(get_managed_object(self, tag),
BOOST_PP_ENUM_PARAMS_Z(1, N, a));
// here's the class I'm trying to send down
class Scene
{
public:
MeshP mesh(int key);
void clearScene();
CameraP createCamera(QString name);
MeshP createMesh(QString name);
void setMesh(int meshKey, MeshP mesh) {
_meshes[meshKey] = mesh; }
QHashIterator<int, MeshP> meshes() { return
QHashIterator<int,MeshP>(_meshes); }
QHashIterator<int, CameraP> cameras() { return
QHashIterator<int,CameraP>(_cameras); }
CameraP fetchCamera(QString name);
QList<QString> importExtensions();
void importFile(QString fileName);
void evalPythonFile(QString fileName);
Scene();
protected:
int uniqueCameraKey();
int uniqueMeshKey();
QString uniqueName(QString prefix);
private:
QHash<int,MeshP> _meshes;
QHash<int,CameraP> _cameras;
//QHash<int,Light*> _lights;
QSet<QString> _names;
// PythonQtObjectPtr _context;
object _pyMainModule;
object _pyMainNamespace;
public slots:
void pythonStdOut(const QString &s)
{ std::cout << s.toStdString() << std::flush; }
void pythonStdErr(const QString &s)
{ std::cout << s.toStdString() << std::flush; }
};
// first I create the mapping, which I'm not sure is correct, trying
to follow: http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/
struct SceneToPython
{
static PyObject* convert(Scene const& scene)
{
return boost::python::incref(boost::python::object(scene).ptr());
}
};
// then I register it
boost::python::to_python_converter<Scene,SceneToPython>();
// then I send it down from inside my Scene object
try {
object processFileFunc =
_pyMainModule.attr("MeshImporter").attr("processFile");
processFileFunc(this, fileName); // seems to error here
} catch (boost::python::error_already_set const &) {
QString perror = parse_python_exception();
std::cerr << "Error in Python: " << perror.toStdString() << std::endl;
}
I'm not really sure what actually is wrong besides something being
setup incorrectly. Do I need to make a python-to-C++ converter as
well even if I'm not sending it back to C++? Or is my convert()
function just improperly implemented? I wasn't sure how much I need
to actually get it to map correctly. Thanks.
More information about the Cplusplus-sig
mailing list