====== 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.