Question

Je suis vraiment nouveau à C -> interaction Python et je écris actuellement une petite application en C qui va lire un fichier (en utilisant Python pour l'analyser), puis en utilisant les informations analysées pour exécuter de petits extraits de Python. En ce moment, je me sens très bien comme je suis réinventer la roue, par exemple cette fonction:

typedef gpointer (list_func)(PyObject *obj);

GList *pylist_to_glist(list_func func, PyObject *pylist)
{
    GList *result = NULL;
    if (func == NULL)
    {
        fprintf(stderr, "No function definied for coverting PyObject.\n");
    }
    else if (PyList_Check(pylist))
    {
        PyObject *pIter = PyObject_GetIter(pylist);
        PyObject *pItem;

        while ((pItem = PyIter_Next(pIter)))
        {
            gpointer obj = func(pItem);
            if (obj != NULL) result = g_list_append(result, obj);
            else fprintf(stderr, "Could not convert PyObject to C object.\n");
            Py_DECREF(pItem);
        }
        Py_DECREF(pIter);
    }
    return result;
}

Je voudrais vraiment faire cela d'une manière plus facile / plus intelligent moins sujette à des fuites de mémoire et les erreurs.

Tous les commentaires et suggestions sont appréciés.

Était-ce utile?

La solution

Je recommande PySequence_Fast et les amis:

else
{
    PyObject *pSeqfast = PySequence_Fast(pylist, "must be a sequence");
    Py_ssize_t n = PySequence_Fast_GET_SIZE(pSeqFast);

    for(Py_ssize_t i = 0; i < n ; ++i)
    {
        gpointer obj = func(PySequence_Fast_GET_ITEM(pSeqfast, i));
        if (obj != NULL) result = g_list_append(result, obj);
        else fprintf(stderr, "Could not convert PyObject to C object.\n");
    }
    Py_DECREF(pSeqfast);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top