2009-07-02 9 views
5

Qualcuno può darmi suggerimenti sugli strumenti o sul software da utilizzare per estendere Python con C/C++? Grazie.Estensione di Python con C/C++

+6

Quando leggi http://docs.python.org/c-api/ quali problemi hai avuto? –

+0

Cython è una buona opzione per fare questo! In realtà ho scritto un piccolo post su di esso, coprendo tutti i dettagli dalla scrittura dei file di origine Cython alla loro costruzione, scrivendo setup.py - basicamente tutto ciò che serve per avvolgere una libreria C/C++ con Cython: http://martinsosic.com/ sviluppo/2016/02/08/wrapping-c-library-as-python-module.html – Martinsos

risposta

8

Utilizziamo SWIG per racchiudere le nostre librerie C/C++ per l'uso in Python. Funziona abbastanza bene.

http://www.swig.org/

13

Il Python sito stesso ha una grande set of examples, così come API documentation. Questo è letteralmente tutto ciò che ho usato quando avevo bisogno di scrivere estensioni C.

+0

+1: è già ben documentato. –

+0

oh pensavo volessi dire in senso figurato, grazie per il chiarimento – andrewrk

+0

Il codice scritto a mano è il migliore se la libreria non è straordinaria di grandi dimensioni (come QT o WxWidgets). – Lothar

2

Sì, avete bisogno di questo: http://www.python.org/doc/ext/

E, naturalmente, anche un C/C++ compiler.

Se descrivi cosa stai cercando di fare, e che tipo di estensioni stai facendo sono sicuro che le persone possono darti maggiori informazioni.

Ci sono cose come SWIG per avvolgere le librerie, se è quello che vuoi fare. Se si desidera solo accelerazioni, C è spesso la risposta, ma non sempre, ecc.

13

Aggiungerò il riferimento obbligatorio a Boost.Python per gli articoli C++.

+0

Ho iniziato a utilizzare boost.python pochi giorni fa e sono già attivo e funzionante. –

3

Ci sono molte soluzioni. In generale, dovresti evitarlo se possibile, poiché scrivere estensioni C è noioso. Spesso è necessario utilizzare una libreria di terze parti. In tal caso, penso che la soluzione vincente oggi sia cython.

Cython è un linguaggio "simile a python", ma può essere reso molto più veloce utilizzando la digitazione opzionale. È possibile chiamare direttamente le funzioni C all'interno e la maggior parte del conteggio dei riferimenti (il problema più difficile nelle estensioni C) viene eseguito automaticamente. Nella mia esperienza, è molto meglio di boost.python, swig o ctypes:

  • boost.python ha senso solo per il wrapping di estensioni C++ IMHO. Lo trovo troppo complicato e difficile da eseguire il debug quando qualcosa va storto.
  • swig ha un po 'di overhead e non porta a un buon codice. E funziona bene per un paio di funzioni, ma le estensioni non banali spesso uso typemaps, e la sintassi ottenere brutto rapidamente

Con Cython, è possibile utilizzare gli oggetti Python (elenco, dict, ecc ...) per avvolgere il vostro Libreria C Certo, è anche molto utile se hai bisogno di scrivere la tua estensione solo per motivi di velocità. Nella comunità scientifica di Python, penso che cython sia diventato lo strumento di scelta quando è necessaria la velocità.

+0

Dire "dovresti evitarlo se possibile" senza conoscere le ragioni per cui l'OP vuole farlo in primo luogo è sbagliato. C'è una ragione per cui Python supporta le estensioni C, ed è perché a volte un'estensione C è la soluzione migliore, nel qual caso non dovrebbe essere evitata. Anche i ctype hanno molti vantaggi rispetto a cython a seconda del contesto, senza il quale è errato dire che uno è meglio (vedi http://stackoverflow.com/questions/1942298/wrapping-ac-library-in-python-c-cython- o-ctypes) – mwag

6

Vedo che nessuno ha ancora indicato una delle mie soluzioni preferite per il wrapping del codice C++, SIP (credo che funzioni anche per il wrapping C, come SWIG e diversamente da Boost, ma non l'ho mai usato in questo modo). È lo strumento sviluppato da Riverbank Software per rendere PyQt, l'interfaccia Python per il meraviglioso framework multipiattaforma Qt C++, quindi è una scelta naturale se il tuo codice C++ utilizza qualsiasi funzionalità Qt, proprio come Boost Python è la scelta naturale se il tuo codice C++ usa Boost.

SWIG è ciò che usiamo al lavoro (una decisione ragionevole quando è stata fatta 10 anni fa; - ma se ti interessa solo di Python è difficile vedere qualcosa che lo faccia risaltare.

Se si sta semplicemente avvolgendo una DLL esistente/così, oltre a Cython, quali altre risposte hanno evidenziato (e io approvo, ma - sta cambiando molto velocemente in questi giorni, quindi fate attenzione se avete bisogno di qualcosa di più stabile) , considera il modulo funzione standard ctypes - Non lo userei per lavori molto estesi (errori "oops" che un compilatore C o C++ ti indicherà può causare arresti anomali del runtime con ctype), ma per piccoli lavori è ottimo (e molto utile dato che viene fornito con le distribuzioni standard di Python! -).

Il buon vecchio C API non è ancora morto - proprio oggi ha incontrato con il caso, il ragazzo fantastico che sta facendo la maggior parte della corsa ultimamente per il mio buon progetto vecchio open source gmpy, e insieme abbiamo deciso di rimanere con il C API per almeno la prossima versione di gmpy - prenderemo in considerazione il passaggio a Cython quando si stabilizza, ma abbiamo convenuto che lo switch sarebbe ancora un po 'prematuro ora. (Non abbiamo nemmeno pensato ad alcuna altra alternativa, perché il punto principale di gmpy è essere il più accecante possibile che possiamo farcela!).

+0

Cosa ne pensi di Siboken, l'equivalente di PySide? http://www.pyside.org/docs/shiboken/ –

+0

@Craig, non l'ho ancora provato, ho in programma di fare il prossimo lavoro di Qt (quindi avermi dato una possibilità realistica di provare PySide). –

+0

Mi dispiace per l'errore di battitura, intendevo "Shiboken". PySide sembra promettente; Mi dispiace solo che debbano reinventare la ruota. –

3

Ho usato pycxx in passato e mi è davvero piaciuto usare questa libreria.

A mio parere, è più semplice da utilizzare rispetto a SWIG. Non riesco davvero a paragonare a boost.python perché non ho mai veramente usato boost. Penso che pycxx sia più leggero di boost.python ma potrei sbagliarmi.

Il punto chiave con pycxx è che è un wrapper C++ del python c api. È orientato agli oggetti e nasconde tutti i meccanismi difficili. È abbastanza intuitivo per un programmatore Python. È molto facile da usare e ci sono alcuni buoni esempi per iniziare.

Raccomando pycxx come cittadino di prima classe per creare l'estensione python in C++.

Problemi correlati