Esporre un'API C ++ a Python
Domanda
Attualmente sto lavorando a un progetto in cui ho dovuto avvolgere le classi C ++ con Python per poter scrivere il programma. Quindi la mia esperienza specifica riguardava anche l'incorporazione dell'interprete Python nel nostro programma.
Le alternative che ho provato sono state:
-
Boost.Python
Mi è piaciuta l'API più pulita prodotta da Boost.Python, ma il fatto che avrebbe richiesto agli utenti di installare una dipendenza aggiuntiva ci ha fatto passare a SWIG.
-
SWIG
Il vantaggio principale di SWIG per noi era che non richiede agli utenti finali di installarlo per utilizzare il programma finale.
Cosa hai usato per fare questo e qual è stata la tua esperienza con esso?
Soluzione
Ho usato entrambi (per lo stesso progetto): Boost è meglio integrato con STL, e in particolare le eccezioni C ++. Inoltre, il suo meccanismo di gestione della memoria (che tenta di collegare la gestione della memoria C ++ e Python GC) è molto più flessibile di quello di SWIG. Tuttavia, SWIG ha molta migliore documentazione, nessuna dipendenza esterna, e se ottieni la libreria avvolta in SWIG per Python sei più che a metà strada per ottenere anche un wrapper Java / Perl / Ruby .
Non credo che ci sia una scelta netta: per i progetti più piccoli, andrei di nuovo con Boost.Python, per i progetti più grandi e di lunga durata, vale la pena investire di più in SWIG.
Altri suggerimenti
EDIT: il progetto Robin è tristemente abbandonato e non sarà molto utile oggi
Ho usato Robin con grande successo.
Ottima integrazione con i tipi C ++ e crea un singolo file .cpp da compilare e includere nell'oggetto condiviso.
Suggerisco SIP . SIP è migliore di SWIG per i seguenti motivi:
-
Per un determinato set di file, swig genera più codice duplicato (overhead) di SIP. SIP riesce a generare meno codice duplicato (overhead) utilizzando un file di libreria che può essere collegato staticamente o dinamicamente. In altre parole, SIP ha una migliore scalabilità.
-
Il tempo di esecuzione di SIP è molto inferiore a quello di SWIG. Consulta Strumenti Python Wrapper: uno studio delle prestazioni . Purtroppo il collegamento sembra interrotto. Ho una copia personale che può essere condivisa su richiesta.
Un grande vantaggio per Boost :: Python è che consente il completamento di tabulazioni nella shell ipython: importa una classe C ++, esposta direttamente da Boost o la sottoclassi, e da quel momento in poi si comporta davvero come un puro Classe Python.
Il rovescio della medaglia: l'installazione e l'utilizzo di Boost impiegano così tanto tempo che tutto il risparmio di tempo nel completamento di Tab non si ammortizzerà mai ;-(
Quindi preferisco Swig: No bells and whistles, ma funziona in modo affidabile dopo un breve esempio introduttivo.