2010-12-12 18 views
11

Sto provando a compilare il codice sorgente python da foo.py a C usando cython.Compilare Python in C usando Cython

In foo.py:

print "Hello World" 

Il comando sto correndo è cython foo.py.

Il problema è che quando si compila foo.c utilizza gcc, ottengo l'errore:

undefined reference to 'main'.

risposta

19

quando si converte il codice da python in c (utilizzando Cython) lo converte in codice c che può essere compilato in un oggetto condiviso. per renderlo eseguibile, dovresti aggiungere "--embed" al comando di conversione cython. questo flag aggiunge la funzione 'principale' di cui hai bisogno, così puoi compilare il codice c in un file eseguibile. Si noti che avrete bisogno delle librerie di runtime python .so per eseguire exec.

11

Leggere la documentazione di Cython. Questo (si spera) ti insegnerà anche cosa è Cython e cosa non lo è. Cython serve per creare estensioni python (non un compilatore Python-to-C generico), che sono oggetti/DLL condivisi. Le librerie caricate dinamicamente non hanno una funzione main come programmi standalone, ma i compilatori presumono che alla fine stiano collegando un eseguibile. Devi dire loro diversamente tramite flag (-shared methinks, ma ancora una volta, fare riferimento alla documentazione Cython) - o ancora meglio, non compilare te stesso, utilizzare uno setup.py per questo (ancora una volta, leggere la documentazione Cython).

+0

+1 per la spiegazione – user225312

+2

per me questa risposta ha comportato la compilazione di un'estensione di lavoro. la risposta di RoeeK ha risolto il problema di collegamento, ma dopo che Python non è riuscito a importare con errore 'ImportError: il modulo dinamico non definisce la funzione init '. grazie mille, penso sarebbe più bello scriverlo con uno stile meno docile senza assumere la stupidità come suggerisce il 3 rtfm. – deeenes

0

Il modo usuale consiste nell'utilizzare distutils per compilare il file generato da cython. Questo ti dà anche tutte le directory di cui hai bisogno in modo portatile.

Problemi correlati