2012-11-21 26 views
7

Ho uno scenario in cui ho alcune funzioni nelle classi C++ e voglio essere in grado di chiamarle usando uno script python. Diciamo che ho una funzioneChiamare una funzione C++ tramite uno script Python

void greet(_msg); 
    std::cout >> _msg >> std::endl; 

Voglio essere in grado di chiamare esso attraverso una chiamata Python personalizzato e passare gli argomenti ad esso, ad esempio utilizzando

saySomething("Hello") 

Come un file .py lo voglio chiamare la funzione di saluto e passare "Ciao" come argomento.

So che è un argomento che è stato ampiamente discusso, e ho fatto una parte della ricerca sull'incorporazione di python in C++, sono riuscito a leggere i valori da uno script python usando l'API standard di Python/C ed eseguire una funzione in Python da C++ e passare argomento ad esso, ma non riesco a capire come ottenere questo risultato specifico.

Ho dato un'occhiata ai ctype e alle varie librerie di wrappin come boost: python o swig, ma non riesco a capire fino a che punto potrebbero aiutarmi a realizzare il desiderio che voglio.

+0

"eseguire una funzione in Python da C++" cosa intendi con questo? Se ti piace mascherare C/C++ come API Python puoi applicare le regole di base dei binding Python per C/C++, c'è anche la libreria boost :: python che può essere più facile da gestire quando si scrive l'API python a partire dal codice C++. – user1797612

+0

Mi spiace che non sia chiaro - Quello che voglio è essere in grado di avere uno script python che chiama una funzione specifica di una classe C++ in grado di passare argomenti ad essa. Più o meno come una GUI, ma eseguita tramite script python anziché pulsanti. – leoncvlt

+0

quindi stai cercando questo http://docs.python.org/3.2/extending/extending.html, o boost :: python (probabilmente più semplice), e anche le risposte a questa domanda possono essere un buon punto di partenza http: //stackoverflow.com/questions/276761/exposing-ac-api-to-python. Ad ogni modo, vuoi generare python api per il codice C++, questo è tutto, basta seguire la guida ufficiale o usare questa librerie. – user1797612

risposta

5

A seconda della versione di Python che ti interessa, 2.xo 3.x, leggere le Estensione e Incorporare il capitolo Python Interpreter per 2.x o 3.x. Sei interessato solo a che estende Python, quindi sezione 1. L'estensione di Python con C o C++ ti fornirà una spiegazione completa su come implementare ciò che ti serve per poter chiamare le tue funzioni implementate in C++ dallo script Python .

Certo, ci sono numerose biblioteche e generatori che permettono di avvolgere le API C/C++ per Python (ad esempio Boost.Python o SWIG), ma il tuo caso suona abbastanza semplice, che, ai fini di apprendimento che è IMO meglio di abituarmi con API Python C. Anche se si utilizzano questi strumenti, si dovrà spesso scendere all'API Python C comunque o almeno comprenderlo.

3

È possibile utilizzare la funzione weave.inline(), che fa parte del pacchetto scipy, per compilare ed eseguire file C/C++ e ottenere il loro output dal proprio script python.

4

Recentemente ho avuto bisogno di fare proprio questa cosa. Boost.Python fa quello che stiamo cercando (e anche di più) ma personalmente (tanto quanto amo Boost) trovo un po 'eccessivo dover trascinare metà della libreria Boost per ottenere una funzione. Anche SWIG non era un'opzione per me in quanto la generazione del codice diventa sempre un problema da mantenere mentre cambiano le strutture di classe (non fraintendetemi, queste sono SOLUZIONI BRILLANTI!), Ma non quello che stavo cercando).

Quindi, l'unica cosa che mi rimaneva era implementarla dai primi principi (API Python/C). Hense, "ECS: Python" è nato. ECS: Python (Embedded C++ Scripting with Python) è una semplice libreria di wrapper Python C++ che ho progettato specificamente per gli sviluppatori C++. Permette di esporre oggetti da un'applicazione C++ a un interprete Python integrato per lo scripting interattivo, ed è molto leggero e facile da usare.

È gratuito (BSD) e open source. Se sei interessato, ecco: http://sourceforge.net/projects/ecspython

+0

Benvenuti nello stack. –

+0

Grazie Miguel-F :) –