Voici un exemple de code que j'ai écrit (avec l'aide de diverses sources en ligne) pour envoyer une chaîne à un code Python, puis retourner une valeur.
Voici le code C call_function.c
:
#include <Python.h>
#include <stdlib.h>
int main()
{
// Set PYTHONPATH TO working directory
setenv("PYTHONPATH",".",1);
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *presult;
// Initialize the Python Interpreter
Py_Initialize();
// Build the name object
pName = PyString_FromString((char*)"arbName");
// Load the module object
pModule = PyImport_Import(pName);
// pDict is a borrowed reference
pDict = PyModule_GetDict(pModule);
// pFunc is also a borrowed reference
pFunc = PyDict_GetItemString(pDict, (char*)"someFunction");
if (PyCallable_Check(pFunc))
{
pValue=Py_BuildValue("(z)",(char*)"something");
PyErr_Print();
printf("Let's give this a shot!\n");
presult=PyObject_CallObject(pFunc,pValue);
PyErr_Print();
} else
{
PyErr_Print();
}
printf("Result is %d\n",PyInt_AsLong(presult));
Py_DECREF(pValue);
// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);
// Finish the Python Interpreter
Py_Finalize();
return 0;
}
Voici le code Python, dans le fichier arbName.py
:
def someFunction(text):
print 'You passed this Python program '+text+' from C! Congratulations!'
return 12345
J'utilise la commande gcc call_function.c -I/usr/include/python2.6 -lpython2.6 ; ./a.out
pour exécuter ce processus. Je suis sur Redhat. Je recommande d'utiliser PyErr_Print() ; pour la vérification des erreurs.