Hi!

I'm trying to access python objects from c++. It works once. Second
time it hangs.
Does someone have any clue or some example code or pointer?

Thanks!
/Karim

Here are some python classes:

--------------------------------------------------------------------------------------------------
import portage

class PortageInterface:
        def __init__(self):
                self.vartree = portage.db[portage.root]["vartree"]
                self.porttree = portage.db[portage.root]["porttree"]

        def installedPackages(self):
                return self.vartree.dbapi.cp_all()

        def installedPackagesVersion(self):
                t = []
                for cpv in self.vartree.dbapi.cpv_all():
                        mysplit = portage.catpkgsplit(cpv)
                        mypkg = "/".join(mysplit[:3])
                        if mysplit[3] != "r0":
                                mypkg = mypkg + "-" + mysplit[3]
                        t.append( mypkg )
                return t

        def portagePackages(self):
                return self.porttree.dbapi.cp_all()

        def allPortagePackages(self):
                t = []
                t = self.porttree.dbapi.cp_all()
                t += self.vartree.dbapi.cp_all()
                return t

        def allPackagesVersion(self):
                t = []
                for x in self.porttree.dbapi.cp_all():
                        t.extend( self.porttree.dbapi.cp_list(x) )
                return t

        def getAllPackageData(self, db, keys):
                rval = {}
                cplist = db.cp_all()
                cplist.sort()
                for cp in cplist:
                        for cpv in db.cp_list(cp):
                                rval[cpv] = db.aux_get(cpv, keys)
                return rval

        def allPackagesData(self):
                testdata = {}
                testdata = self.getAllPackageData(self.porttree.dbapi,
["DESCRIPTION", "HOMEPAGE", "LICENSE", "KEYWORDS", "IUSE", "SLOT"])
                t = []
                for cpv in testdata.keys():
                        mysplit = portage.catpkgsplit(cpv)
                        mypkg = "/".join(mysplit[:3])
                        if mysplit[3] != "r0":
                                mypkg = mypkg + "-" + mysplit[3]
                        t.append( mypkg )
                        for v in testdata[cpv]:
                                t.append( v )
                return t
--------------------------------------------------------------------------------------------------

And the c++ class executed inside a thread:
--------------------------------------------------------------------------------------------------
#include "pythonizer.h"

#ifdef _XOPEN_SOURCE
#undef _XOPEN_SOURCE
#endif

#ifdef _POSIX_C_SOURCE
#undef _POSIX_C_SOURCE
#endif

#include <Python.h>

#include <qstringlist.h>
#include <qfile.h>

#include <kdebug.h>

#define foreach( x ) \
for( QStringList::ConstIterator it = x.begin(), end = x.end(); it !=
end; ++it )

#define LINE_INFO " ( " << k_funcinfo << "Line: " << __LINE__ << " )"
<< endl
#define DEBUG_LINE_INFO kdDebug() << LINE_INFO

Pythonizer::Pythonizer( const char *file, char *pyClass )
        : m_file( file ), m_pyClass( pyClass )
{
        kdDebug() << "Pythonizer::Pythonizer" << endl;
}

Pythonizer::~Pythonizer()
{
        kdDebug() << "Pythonizer::~Pythonizer" << endl;
}

QStringList Pythonizer::getPackages( char *pyModule )
{
        DEBUG_LINE_INFO;

        // Initialize the Python Interpreter
        Py_Initialize();

        PyObject *pName, *pModule, *pDict, *pValue, *pClass, *pInstance;

    // Build the name object
        pName = PyString_FromString( m_file );

        DEBUG_LINE_INFO;
        if ( PyErr_Occurred() ) {
                PyErr_Print();
                PyErr_Clear();
                return QStringList::QStringList();
        }

    // Load the module object
        pModule = PyImport_Import( pName );

        DEBUG_LINE_INFO;
        if ( PyErr_Occurred() ) {
                PyErr_Print();
                PyErr_Clear();
                return QStringList::QStringList();
        }

    // pDict is a borrowed reference
        pDict = PyModule_GetDict( pModule );

        DEBUG_LINE_INFO;
        if ( PyErr_Occurred() ) {
                PyErr_Print();
                PyErr_Clear();
                return QStringList::QStringList();
        }

        // Build the name of a callable class
        pClass = PyDict_GetItemString( pDict, m_pyClass );

        DEBUG_LINE_INFO;
        if ( PyErr_Occurred() ) {
                PyErr_Print();
                PyErr_Clear();
                return QStringList::QStringList();
        }

    // Create an instance of the class
        if ( PyCallable_Check( pClass ) ) {
                pInstance = PyObject_CallObject( pClass, NULL );

                DEBUG_LINE_INFO;
                if ( PyErr_Occurred() ) {
                        PyErr_Print();
                        PyErr_Clear();
                        return QStringList::QStringList();
                }
        }
        else {
                kdDebug() << "Can not create python class instance." << endl;
                return QStringList::QStringList();
        }

        // Call a method of the class with two parameters
        pValue = PyObject_CallMethod( pInstance, pyModule, NULL );

        if ( PyErr_Occurred() ) {
                PyErr_Print();
                PyErr_Clear();
                return QStringList::QStringList();
        }

        PyObject *iterator = PyObject_GetIter( pValue );
        if ( iterator == NULL ) {
                PyErr_Print();
                PyErr_Clear();
                return QStringList::QStringList();
        }

        QStringList packageList;
        PyObject *item;
        while ( item = PyIter_Next( iterator ) ) {
                packageList << PyString_AsString( item );

        /* release reference when done */
                Py_DECREF( item );
        }
        Py_DECREF( iterator );

    // Clean up
        Py_DECREF( pValue );
        Py_DECREF( pInstance );
        Py_DECREF( pClass );
//      Py_DECREF( pDict );
        Py_DECREF( pModule );
        Py_DECREF( pName );

        PyErr_Clear();

        DEBUG_LINE_INFO;

        // Finish the Python Interpreter
        Py_Finalize();

        return packageList;
}
--------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------
#ifndef PYTHONIZER_H
#define PYTHONIZER_H

#include <qstringlist.h>

class Pythonizer{
public:
        Pythonizer( const char *file, char *pyClass );
    ~Pythonizer();

        QStringList             getPackages( char *pyModule );

private:
        QString                 m_file;
        QString                 m_pyClass;
};

#endif
--------------------------------------------------------------------------------------------------

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to