Bien le bonjour !

Je vous fais un petit topo : j'essaye non sans peine de faire de l'embedding python dans une appli C++.

J'ai donc dans mon appli une fonction qui est appelé plusieurs fois de suite. Cette fonction allant chercher des informations dans plusieurs scripts pythons.

Pour une meilleur compréhension, voici le code de la fonction :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
int CPluginManager::GetInfo(int count, CString& result)
{
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pInfo, *pResult;
 
    // On modifie le PATH de l'interpréteur Python pour qu'il aille chercher les plugins où il faut
    PySys_SetPath("..\\Plugin;..\\lib;..\\lib\\site-packages");
 
    pName = PyString_FromString((CStringA)vPluginAdr[count]);
    // Error checking of pName left out
 
    pModule = PyImport_Import(pName);   
    Py_XDECREF(pName); 
 
    if (pModule != NULL) {
		// On accède au dictionnaire du module
		pDict = PyModule_GetDict(pModule);
		pInfo = Py_BuildValue("[s]", "");
 
		// On ajoute un attribut à notre dictionnaire
		PyDict_SetItemString(pDict, "info", pInfo);
 
        pFunc = PyObject_GetAttrString(pModule, "GetInfo");
        // pFunc is a new reference
 
        if (pFunc && PyCallable_Check(pFunc)) {
            pValue = PyObject_CallObject(pFunc, NULL);
            if (pValue != NULL) {
				// On accède à une propriété du dictionnaire
				pResult = PyDict_GetItemString(pDict, "info");
				result = PyString_AsString(PyList_GET_ITEM(pResult,0));
 
                Py_DECREF(pValue);
				Py_DECREF(pResult);
            }
            else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                return 1;
            }
        }
	PyErr_Clear();
	Py_XDECREF(pFunc);
	Py_XDECREF(pDict);
	Py_XDECREF(pInfo);        
        Py_XDECREF(pModule);
    }
    return 0;
}
La première exécution de cette fonction fonctionne parfaitement, mais à la deuxième exécution, lors du "pModule = PyImport_Import(pName); " qui est donc la première définition d'un PyObject dans la fonction, une "Assertion Failed !" me saute au visage m'indiquant que c'est l'expression gc->gc.gc_refs != 0 qui pose problème.

Je précise que ce message d'erreur survient uniquement lors d'une compilation en debug, en release il n'y a pas de problème à ce niveau. Par contre en release, j'ai une exception qui est levée au moment du Py_Finalize(); Je ne serais pas étonné qu'il y a un lien entre les deux en tout cas.

J'espère avoir été assez clair dans la description de mon problème et que vous pourrez m'éclairer à ce sujet =)