2010-08-16 16 views
3

Je suis en train d'écrire une fonction native qui renverra plusieurs objets PythonDe retour un tuple d'objets multipe dans l'API Python C

PyObject *V = PyList_New(0); 
PyObject *E = PyList_New(0); 
PyObject *F = PyList_New(0); 

return Py_BuildValue("ooo", V, E, F); 

Cette compile bien, cependant, quand je l'appelle d'un programme Python, je reçois un erreur:

SystemError: bad format char passed to Py_BuildValue

Comment cela peut-il être fait correctement?

EDIT: Les travaux suivants

PyObject *rslt = PyTuple_New(3); 
PyTuple_SetItem(rslt, 0, V); 
PyTuple_SetItem(rslt, 1, E); 
PyTuple_SetItem(rslt, 2, F); 
return rslt; 

Cependant, n'est pas là un moyen plus court pour le faire?

+0

Vous devez également se rappeler de décrémenter le compte de référence sur V, E et F ('Py_DECREF (V);', etc.) après avoir appelé 'Py_BuildValue', car' Py_BuildValue' incrémente le compteur de référence de tout objet utilisé avec le spécificateur de format 'O' (voir http://docs.python.org/c-api/arg.html#Py_BuildValue). Sinon, les listes ne seront jamais libérées et vous aurez une fuite de mémoire. – jchl

+0

Merci pour la suggestion. Je retourne 'Py_BuildValue (" NNN ", V, E, F)' qui n'incrémente pas le nombre de références. – dzhelil

Répondre

7

Je pense qu'il veut O-majuscule? "OOO", pas "ooo".

+0

Cela donne toujours le même message d'erreur. – dzhelil

+0

Désolé, j'ai complètement changé ma réponse. Essayez à nouveau ... –

+0

Vous pouvez également ajouter des parenthèses pour que python comprenne que vous voulez construire un tuple: return Py_BuildValue ("(OOO)", V, E, F); – ThR37

-2

Utilisez Cython.

return V, E, F