2010-11-22 17 views
15

Sto sperimentando le funzioni Python adesso. Ho trovato un modo per importare le funzioni Python in codice c/C++, ma non il contrario.Importare la funzione C++ nel programma Python

Ho un programma C++ scritto e ha una certa funzione in esso. Mi piacerebbe "importare" il programma C++ compilato nel mio script python e chiamare la funzione C++.

Per semplicità, dicono che il C++ funzione è semplice come:

int square(x) 
{ 
    return x*x; 
} 

e il programma compilato si chiama Cprog.

Vorrei che il mio script python essere qualcosa di simile:

import Cprog 

print Cprog.square(4) 

è possibile? Ho cercato su Internet inutilmente e spero che uno di voi guru possa avere un modo intelligente di fare questo ...

+2

Hai provato Boost :: Python? – robbrit

+0

No, non l'ho fatto. Ma sembra che potrebbe fare ciò che voglio. Ci sto guardando in questo momento. Molte grazie! Qualcuno sa di un modo meno complicato di fare questo però (senza l'uso di un modulo della terza ruota)? – Nick

risposta

8

Se si costruisce il programma come libreria/DLL condivisa, è possibile utilizzare i tipi chiamarlo

import ctypes 
print ctypes.windll.cprog.square(4) # windows 
print ctypes.CDLL('cprog.so').square(4) # linux 
+0

Ho dimenticato i ctypes, sicuramente la strada da percorrere se sono solo un paio di funzioni che vuoi mostrare. – DaedalusFall

+0

Qual è il modo migliore per creare un file * .so? Scusate, non sono un programmatore/scienziato informatico, e il mio comando g ++ è solitamente sulla falsariga di "g ++ Ccode.cpp -o Cfile". Ho provato a usare -shared come opzione aggiuntiva insieme alla linea di linux suggerita sopra e ho ricevuto un errore. Non penso di aver creato il mio file * .so correttamente ... qualche consiglio? – Nick

+0

@Nick: Questa è una domanda diversa, una che è già stata posta: http://stackoverflow.com/questions/3588476/building-a-shared-library-using-gcc – SingleNegationElimination

3

È necessario creare un modulo python con quella funzione al suo interno. Ci sono tre modi principali:

  1. Utilizzo di Swig - questo legge il codice c e crea un modulo python da esso.
  2. Mano codificata utilizzando python c api.
  3. Utilizzo di Boost :: Python (spesso il modo più semplice).

This pdf copre 1 e 2. This page vi dirà come utilizzare Boost :: Python.

Non è possibile (facilmente) utilizzare una funzione che si trova in un programma c/C++: deve essere in una libreria statica (a cui è possibile collegare anche il programma c/C++).

EDIT - Cython Vale anche la pena menzionare.

+3

Intendi Swig? –

+0

hah! oops! infatti ho fatto il collegamento – DaedalusFall

0

Ci sono molti modi diversi per avvolgere il codice C++ da utilizzare in Python. La maggior parte sono elencati sul wiki Python here.

Ho trovato un modo abbastanza semplice per automatizzare è quello di utilizzare py++ per generare automaticamente i wrapper, quindi compilare i file generati. Ma questo è più appropriato per i progetti più grandi in cui avvolgere tutto a mano non è molto fattibile e potrebbe causare un incubo di manutenzione.

+0

py ++ è rotto – SAAD

21

Ecco un breve completamento del semplice esempio sopra riportato. Anche se il thread è vecchio, penso che sia utile avere una guida onnicomprensiva semplice per i principianti, perché ho anche avuto alcuni problemi prima.

funzione.contenuto cpp (extern "C" utilizzato in modo che ctypes modulo può gestire la funzione):

extern "C" int square(int x) 
{ 
    return x*x; 
} 

contenuto wrapper.py:

import ctypes 
print ctypes.windll.library.square(4) # windows 
print ctypes.CDLL('library.so').square(4) # linux or when mingw used on windows 

quindi compilare il file function.cpp (utilizzando ad esempio MinGW):

g++ -shared -c -fPIC function.cpp -o function.o 

quindi creare l'libreria di oggetti condivisi con il seguente comando (nota: non ovunque sono spazi):

g++ -shared -Wl,-soname,library.so -o library.so function.o 

Quindi eseguire il wrapper.py e il programma dovrebbe funzionare.

Problemi correlati