Bonjour,
J’essaie de lancer plusieurs fois un code python depuis un code C. La première fois que le code Python se lance, tout fonctionne correctement mais la seconde fois que je tente de le lancer j’obtiens une segmentation fault.
Voici un code qui reproduit le problème:
code C:
`//prgm.c
#include <stdio.h>
#include "Python.h"
int main(void) {
Py_Initialize();
/* add . to the path */
PyObject* sys = PyImport_ImportModule("sys");
PyObject* path = PyObject_GetAttrString(sys, "path");
PyList_Insert(path, 0, PyUnicode_FromString("."));
/* import desired function */
PyObject* pModule = PyImport_ImportModule("main");
PyObject* pFunc = PyObject_GetAttrString(pModule, "main");
/* call it */
PyObject* pArgs = Py_BuildValue("(s)", "137912500");
PyObject_CallObject(pFunc, pArgs);
Py_Finalize();
fprintf(stderr,"End of python software");
Py_Initialize();
/* import desired function */
pModule = PyImport_ImportModule("main");
pFunc = PyObject_GetAttrString(pModule, "main");
/* call it */
pArgs = Py_BuildValue("(s)", "137912500");
PyObject_CallObject(pFunc, pArgs);
Py_Finalize();
fprintf(stderr,"End of python software");
while(1);
return 0;
}`
code Python:
def main(freq):
print("test python")
Avec le gdb j’ai pu observer que la seconde fois que la ligne pModule = PyImport_ImportModule("main");
s’exécute alors pModule retourne NULL:
`(gdb) next
24 pModule = PyImport_ImportModule("main");
(gdb) next
25 pFunc = PyObject_GetAttrString(pModule, "main");
(gdb) print pModule
$4 = (PyObject *) 0x0
(gdb) next
Thread 1 "scheduling" received signal SIGSEGV, Segmentation fault.
0x00007ffff7cadc5e in PyObject_GetAttrString ()
from /lib/x86_64-linux-gnu/libpython3.8.so.1.0`
En lisant la doc de l’API Python en C, j’ai l’impression que Py_INCREF pourrait résoudre ce problème alors j’ai essayé de le placer après la ligne 15 mais ça n’a pas fonctionné.
J’essaye de lancer un code Python plusieurs fois car à terme j’aimerai utiliser ce code python dans une application multi threads en C que je suis en train d’écrire.
Auriez vous une idée de comment résoudre ce problème ?
Merci d’avance pour votre aide