2014-12-15 19 views
5

Sono ben consapevole delle molte possibilità che esistono per consentire al codice C di eseguire codice Python e viceversa (Cython, Boost.Python, ...). Tuttavia, a meno che non mi sbagli, tutti questi approcci si limitano a "chiamare" gli script Python rilevanti e a gestire le interazioni tra il programma C e lo script Python. Pertanto, è richiesta un'installazione di python.Compilare il codice Python e collegarlo al programma C++?

Nella mia situazione, mi piacerebbe una soluzione autonoma, in cui il mio codice Python può essere in qualche modo compilato e collegato al mio programma C++ principale. Ho avuto speranze con Cython, in quanto mi ha permesso di compilare il mio script e creare un file .so. Tuttavia, non sembra che sia stato in grado di "collegare" quel file .so al mio programma C++. Ho tentato quanto segue:

Un semplice script python contenente una funzione moltiplicata (a, b) che restituisce un * b; Ho creato un file libmultiply.so usando cython. un breve file di Cpp, che emette il risultato di moltiplicazione (5,2):

int multiply(int, int); 

int main() 
{ 
    std::cout << multiply(5,2) << std::endl; 
} 

costruisco facendo: g ++ test.cpp -L/home/Jerome/-lmultiply

che dà me l'errore:

test.cpp:(.text+0x2b): undefined reference to `multiply(int, int)' 
collect2: error: ld returned 1 exit status 

non sono sicuro se quello che ho provato un senso, ma si spera che vi dà un'idea di quello che vorrei realizzare.

+0

Cython non può farlo. Emette codice che collega all'API Python/C. A meno che l'API non sia disponibile, tutto ciò che costruisci da Cython non funzionerà. Inoltre (AFAIK) fa qualche manomissione di nome abbastanza aggressiva. – Kevin

+0

Non è possibile 'compilare' il codice Python; funziona su una VM. Tuttavia, puoi "congelarlo" con qualcosa come "[PyInstaller] (https://pypi.python.org/pypi/PyInstaller)" (che può creare DLL/SO). E 'quello che stai cercando di fare? O forse "[cercando di capire la procedura di collegamento per scrivere python/c hybrid] (http://stackoverflow.com/questions/9826311/trying-to-understand-linking-procedure-for-writing-python-c-hybrid?rq = 1) "aiuterà. –

+1

@snotwaffle Puoi compilarlo. Devi solo scrivere il compilatore :-) (dal momento che non sono a conoscenza di uno che è prontamente disponibile). –

risposta

2

Shed Skin è la cosa più vicina che ho trovato. Compila un sottoinsieme tipizzato di Python in C++. Probabilmente non è robusto come vorresti ma questo è un caso di uso strano. Se hai voglia di scrivere qualcosa da te, puoi guardare in LLVM che è stato utilizzato per creare cose simili a ciò che desideri.

Edit 1:

Ho appena trovato questo elenco di cose pitone impressionante su GitHub, Awesome-python, e link ad Pyston che è un'implementazione pitone LLVM. Può essere più adatto a ciò che vuoi o un punto di partenza per un bridge da Python a C++.

Problemi correlati