====== Integrare l'interprete Python in applicazioni C/C++ ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//12/07/2008//** \\ \\
risorse: [[http://www.linuxjournal.com/article/8497|Embedding Python in Your C Programs (Linux Journal)]]
E' possibile integrare nelle nostre applicazini C e C++ del codice scritto in python, anche prelevato da uno o più file esterni.\\
Per compilare queste applicazioni abbiamo bisogno dei **pacchetti di sviluppo di python e ovviamente dell'interprete python**.\\
I nostri programmi verranno lincati ad una libreria dinamica '' libpython2.5.so'' (per python 2.5) grazie agli header del python, di solito collocati in /usr/include/python2.5/ (per python 2.5).\\
Il nostro progetto è composto da 3 file, il ''main.c'' contenente il codice C, il makefile e un file di nome ''file.py'' con del codice python a piacere.
===== Il make file =====
Se si usa un'altra versione di python cambiare tutte le occorrenze di python2.5 con la versione che si vuole lincare.
CPP = gcc
OPTS = `python-config --includes --libs --cflags --ldflags` -lpython2.5 -lm -L/usr/lib/python2.5/config
all:
$(CPP) main.c -o main $(OPTS)
clean:
rm main
Vorrei far notare che per le guide che ho trovato in rete nella seconda riga, nella variabile OPT, bastava soltanto ''python-config --includes --libs --cflags --ldflags'', purtroppo nelle prove che ho fatto non è stato così, in quanto il comando ''python-config'' non riusciva a fornire al compilatore i giusti flag anche per la libreria condivisa '' libpython2.5.so'' . Come si può osservare ho risolto specificando il percorso . ''-lpython2.5 -lm -L/usr/lib/python2.5/config
'' .
===== Il main.c =====
#include
#include
void exec_pycode(const char* code)
{
Py_Initialize();
PyRun_SimpleString(code); //esegue semplicemente l'istruzione contenuta in code
Py_Finalize();
}
void exec_pyfile(char* filepy)
{
FILE* f= fopen(filepy, "r");
Py_Initialize();
PyRun_SimpleFile(f, filepy); //esegue semplicemente le istruzioni contenute nel file filepy
Py_Finalize();
fclose(f);
}
int main(int argc, char* argv[] ){
printf("%s\n","Eseguo istruzione python print 'Ciao python': ");
exec_pycode("print 'Ciao python'; ");
printf("%s\n","Eseguo istruzione python all'interno del file file.py : ");
exec_pyfile("file.py");
return 0;
}
===== Quali sono le dipendenze del nostro programma? =====
Andiamole a controllare con il comando ''ldd''
ldd main
linux-gate.so.1 => (0xffffe000)
libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7db1000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7d8c000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7c3e000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7c26000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7c22000)
libutil.so.1 => /lib/i686/cmov/libutil.so.1 (0xb7c1e000)
/lib/ld-linux.so.2 (0xb7efa000)
Come si può vedere l'unica dipendenza legata al python è **/usr/lib/libpython2.5.so.1.0**, basterebbe distribuirla con il nostro programma (installandola nel path di ricerca delle librerie [/usr/lib o /usr/local/lib]) e dovremmo poter far a meno dell'interprete python.\\
Lo stesso si dovrebbe fare per eventuali moduli aggiuntivi.