|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
boost::python ed embedding
C'e' qualcuno che si e' gia' cimentato con boost:
![]() Non riesco a capire come inizializzare correttamente l'interprete o, forse, come caricare i moduli. Esempio: questo dovrebbe essere il codice che inizializza l'interprete con un ambiente vuoto, carica del codice da file esterno, e poi cerca di estrarne alcuni valori Codice:
Py_Initialize(); dict global; object result = exec_file("test.py", global, global); object test = global['x']; cout << (extract< int >(test)) << endl; object test2 = global["Klass"]; object instance = test2(); cout << (extract< int >(instance.attr("go")())) << endl;
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non ti nascondo che la cosa interesserebbe anche me, perché in azienda utilizziamo alcune applicazioni scritte in C/C++ che hanno un loro linguaggio di script (penoso) che vorrei sostituire con Python.
La domanda sorge spontanea: è strettamente necessario utilizzare la libreria boost per poter "inglobare" Python in un'applicazione C/C++? Perché ricordo che per installarla e configurarla con Windows e Visual Studio 2005 Express Edition è stato un tantino complicato (inoltre, se possibile, vorrei poter fare a meno di queste librerie enormi, composte da migliaia e migliaia di piccoli file). Comunque in questo periodo non ho molto tempo, ma posso do un'occhiata alla documentazione e vado a controllare i sorgenti di alcune applicazioni che utilizzano Python embedded (mi viene in mente Blender al momento).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Vedere qui: http://docs.python.org/ext/ext.html
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ottimo!!! Ti ringrazio per il magnifico link sull'argomento (c'è pure un demo a disposizione
![]() ![]() Mi pareva strano che bisognava rivolgersi a delle librerie che sono degli autentici pachidermi. "Simple is better" ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys Ultima modifica di cdimauro : 11-06-2007 alle 13:39. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Innanzi tutto rispondo alla mia domanda.
A quanto pare non funziona mettendo tutto vuoto, bisogna importare il modulo principale, e operare da li'. Codice:
Py_Initialize(); pythonModule = object(handle<>(borrowed(PyImport_AddModule("__main__")))); global = pythonModule.attr("__dict__"); object result = exec_file("test.py", global, global); object test = global['x']; cout << (extract< int >(test)) << endl; object test2 = global["Klass"]; object instance = test2(); cout << (extract< int >(instance.attr("go")())) << endl; ![]()
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Premetto che non conosco boost ... comunque ho visto che esiste una libreria chiamata Boost.Python, che consente l'interoperabilità tra C++ e Python. Una cosa è usare questa libreria e quindi usare ciò che è definito come funzioni, namespace o altro in tale libreria. E una cosa è voler usare direttamente le funzioni fornite dall'interprete Python.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Il problema e' che la documentazione per le boost: ![]() Ad esempio e' si' scritto che le eccezioni se le gestisce lui, ma non ho trovato da nessuna parte il fatto che quando l'eccezione la lancia python, a livello C++ viene lanciata una particolare eccezione, e che devi interrogare l'interprete per avere l'errore specifico. Tra l'altro nessun metodo/funzione specifica le eccezioni che lancia per cui alla fine ho spulciato il codice, e mi e' venuto fuori qualcosa del genere Codice:
/* ... */ exec( "import sys,cStringIO\nsys.stderr = cStringIO.StringIO()", pythonNamespace, pythonNamespace ); object pythonStderr = pythonNamespace["sys"].attr("stderr"); /* ... */ try { /* ... */ } catch (const boost::python::error_already_set&) { PyErr_Print(); object m = pythonStderr.attr("getvalue")(); string msg = string(extract<char*>( m )); cerr << "Python Error: " << msg << endl; } ![]() Le boost a me non sono mai piaciute (proprio per questo), ma visto che il progetto su cui sto mettendo le mani le utilizza gia' per altri motivi, mi sembrava la cosa piu' naturale. Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Quote:
![]()
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Comunque si', avrei preferito utilizzare il wrapper fornito da boost piuttosto che direttamente la funzione di Python, ma vedo che anche altri hanno usato senza problemi questa soluzione per cui per il momento mi accontento cosi'. edit: ho visto ora che mi converte delle faccine di troppo ... forse quello ha creato confusione
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
D'altra parte noto che per inizializzare Python utilizzi Py_Initialize(), invece di qualche altra funzione di boost :: python.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#11 | ||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Sarà che la sintassi del C++ non la digerisco proprio. ![]() Quote:
I programmatori open source sarebbero disposti a cedere la moglie, piuttosto che "perdere tempo" scrivendo documentazione. ![]() E pensare che queste librerie sono candidate a diventare parte delle framework standard del C++... ![]() Quote:
La cosa che non mi spiego è la presenza di tipi inesistenti: il codice non dovrebbe nemmeno essere compilabile! ![]() Quote:
Quote:
![]() Comunque personalmente proverò, quando possibile, a utilizzare gli esempi e la documentazione postata da andbin: li trovo più chiari, e poi per quello che ho in mente di fare ("mappare" alcune funzioni e variabili C in modo che siano visibili anche dall'ambiente Python) dovrebbe andare benissimo.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||
![]() |
![]() |
![]() |
#12 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Quote:
![]() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:38.