Je me bats un peu avec l'API Python C. J'appelle une méthode python pour faire du jeu IA à environ 60hz. Cela fonctionne le plus du temps mais chaque seconde ou alors l'appel à PyEval_CallObject aboutit à une valeur de retour NULL. Si je détecte correctement l'erreur et continue en boucle, tout va bien pour la prochaine seconde ou plus, après quoi l'erreur se produit à nouveau.PyEval_CallObject échouant en boucle de temps en temps
Je pense que je suis en train de faire quelque chose de mal avec le comptage ref mais je ne peux pas savoir ce qu'il est:
int script_do_ai(struct game_data_t* gd)
{
PyObject *pAiModule, *pResult;
float result=0.0;
pResult = NULL;
pAiModule = PyImport_Import(PyString_FromString("ai_script"));
Oui, je suis d'importer le module chaque itération. Est-ce nécessaire? Si je stocke pAiModule comme global, j'obtiens un crash dur après environ une seconde.
pResult = PyEval_CallObject(PyObject_GetAttrString(pAiModule, "do_ai"),
Py_BuildValue("f", gd->important_float))
if (pResult != NULL)
{
PyArg_Parse(pResult, "f", &result);
Py_DECREF(pResult);
ConquerEnemies(result); //you get the idea
}
else //this happens every 75 or so iterations thru the loop
{
if (PyErr_ExceptionMatches(PyExc_SomeException)) //? not sure what to do here
{
Je n'ai pas été en mesure de savoir comment extraire l'exception encore, que ce soit ... sans test pour tous les exception
}
}
Suis-je encore près de faire ce droit? Comme je l'ai dit, cela fonctionne surtout mais j'aimerais vraiment comprendre pourquoi je reçois une erreur.
Merci d'avance pour toute aide.
+1 merci ... Je me suis dit que si je soulignais l'appel à Py_BuildValue, il prendrait soin de la référence de fuite, mais peut-être pas. Je vais voir ce que PyErr_Fetch me donne sur pyErr_Occurred –
Hélas, C n'est pas ramassé garbage :) PyErr_Print() est assez pratique pour imprimer des exceptions, en particulier lors du débogage des cas comme celui-ci. –
Ouais trop de temps en. NET-terrain pour moi. Ok, c'est bizarre. J'ai ajouté "sys.stdout = open ('CONOUT $', 'wt')" à mon script python (pour sortir en console ... je suis dans Win32) et tout a fonctionné comme par magie. Bizarre. –