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?

È stato utile?

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:

  1. 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à.

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

pyrex o cython sono anche buoni e facili modi per mescolare i due mondi.

Avvolgere C ++ usando questi strumenti è un po 'più complicato che avvolgere C ++ ma può essere fatto. Qui è la pagina wiki a riguardo.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top