2011-11-09 20 views
5

Ho problemi con cython in buildout.Buildout con build di parti con Cython

Una delle parti è un modulo creato con cython da un file .c e un file .pyx.

Ho già provare molte soluzioni:

Ma tutto si conclude con l'errore:

ImportError: No module named Cython.Distutils

Questo accodamento quando buildout caricare il setup.py di questo modulo cython.

Si noti che il setup.py è funzionale quando chiamato dalla propria directory e con un interprete nella directory bin di buildout.

Grazie per il vostro aiuto.

+0

Sei sicuro che Cython sia installato correttamente e hai impostato la variabile di ambiente 'PYTHONPATH' per includere la dir dove vivono i moduli Cython? –

+0

Intendevi a livello di sistema? Questo renderà impossibile creare questo buildout su un sistema senza cython ...? –

+0

Cosa intendi per "livello di sistema"? –

risposta

4

Gli articoli collegati indicano come installare Cython da un buildout, ma per farlo è necessario l'accesso in scrittura alla cartella site-packages. Ci sono 3 modi si dovrebbe essere in grado di farli funzionare buildout:

  1. Esegui come root e installare Cython in site-packages del pitone sistema. Di solito vuoi evitare di farlo.

  2. Compila il tuo Python. Questa potrebbe essere l'unica opzione se vuoi che usi una versione di Python che non è già presente nel sistema. Ci sono le configurazioni di build che ti permetteranno di costruire qualsiasi versione di Python all'interno del buildout.

  3. Utilizzare virtualenv. Questo creerà (nella cartella buildout) un ambiente virtuale completo per Python compresa la tua cartella site-packages. Questo è in genere il modo migliore per eseguire un build che può utilizzare il sistema Python (o qualsiasi altro Python che è stato già installato a livello di sistema da ).

Suggerisco di utilizzare virtualenv parte delle istruzioni di installazione del software.

+0

Grazie per questa proposta, scaverò in questo modo. –

1

Non c'è modo di fare questo come un singolo passaggio, ma è facile da fare come un processo in due fasi.

Usa:

python bootstrap.py 
./bin/buildout install cython 
./bin/cpy bootstrap.py 
./bin/cpy ./bin/buildout 

Il motivo di questo è possibile è perché buildout supporta un'opzione oscura 'installazione', che nessuno mai parla, ma si possibile usarlo, in questo modo:

[buildout] 
parts = deps py # <---- Notice we don't depend on cython here 
eggs = 
    whatever 
    kdist 
    nark 
    kivy # <--- But we do have a module that requires cython to build 
develop = 
    . 
    lib/nark 
    lib/kivy-dist 

[cython] # <---- By calling ./bin/buildout install cython we trigger this 
recipe = zc.recipe.egg:script 
parts = cython-py 
interpreter = cpy # <--- Which makes our dummy ./bin/cpy 
eggs = 
    cython 
    pyinstaller 

[deps] 
recipe = zc.recipe.egg:eggs 
eggs = ${buildout:eggs} 

[py] 
recipe = zc.recipe.egg:script 
interpreter = py 
eggs = ${buildout:eggs} 

La cosa carina di questo approccio è che eseguire buildout una seconda volta cancella la directory bin così alla fine della giornata, ti rimane una directory bin che ooks come questo:

$ ls bin/ 
buildout garden py 

Nessun pacchetti rimanenti che possono o non possono appendere intorno nella vostra virtualenv e avvitare le cose più tardi. Questo è il motivo per cui stiamo usando buildout, in primo luogo, giusto?

... naturalmente, se si desidera che cython si blocchi, si attacca anche alle dipendenze in alto.

+0

So cool non sapeva di quel parametro ed è il pezzo mancante che stavo cercando (per non ricostruire tutte le parti sempre quando si esegue buildout). Gracias! –

2

Ho trovato oggi questa ricetta https://pypi.python.org/pypi/mr.cython/1.0 che risolve il problema.

Questo risolve il problema installando Cython con una ricetta estensione quindi è disponibile quando conduzione buildout setup.py develop

Il problema era di costruire un modulo Cython senza dover Cython installato come livello di sistema.

+0

La risposta mi sta bene. OP sta rispondendo alla sua stessa domanda con una soluzione e un contesto rilevanti. –

+0

Il fatto che OP ritorni diversi anni dopo la domanda originale per fornire una risposta è molto nello spirito di StackOverflow e merita gli upvotes. Vedi XKCD rilevante: https://xkcd.com/979/ –

+0

@ HåkenLid: Ben detto, ho anche upvoted. @ OP: potresti anche accettare la tua risposta :-) –