2015-12-17 9 views
12

Sembra che per impostazione predefinita da distutils.core con cmdclass impostato su build_ext, compili un file cpp o c nella directory di lavoro corrente. C'è un modo per determinare dove viene scritto il codice c generato? Altrimenti, un repository sarà disseminato di codice generato.Specifica file di output cython

Per esempio questo file setup.py scriverà un file example.c alla directory di lavoro corrente:

from distutils.core import setup 
from Cython.Build import cythonize 

setup(
     ext_modules = cythonize("example.pyx")) 

risposta

7

È possibile passare l'opzione build_dir="directory name" a Cythonize

# rest of file as before 
setup(
     ext_modules = cythonize("example.pyx", 
           build_dir="build")) 

Il codice qui sopra metti i file c generati nella directory "build" (che ha senso, poiché di default è dove distutils mette i file temporanei degli oggetti e così via quando costruisce).


La mia risposta originale aveva working, non build_dir. Grazie a @ArthurTacca per aver sottolineato che non sembra più aver ragione.

+1

l'opzione corretta sembra essere "build_dir" non "funzionante". Forse è cambiato in una versione recente di Cython. Per evitare il contrasto con altri file di build, è probabilmente meglio non usare solo "build". Una sottodirectory come "build/cython" sarebbe meglio. –

+0

Ad una rapida occhiata sembri avere ragione - grazie. Guardando il codice su github non riesco a vedere dove è cambiato dal 2015, quindi chissà da dove l'ho preso (ma immagino che debba aver funzionato in quel momento ...). Lo aggiornerò una volta confermato che funziona. – DavidW

3

dopo aver inizializzato un'estensione, i parametri possono essere impostati per creare c nella directory temp.

module = Extension("temp", "temp.pyx") 
module.cython_c_in_temp = True 
+0

Penso che questa sia una soluzione leggermente migliore della mia risposta. – DavidW

1

Il tuo setup.py va bene.

per farlo costruire in una posizione diversa, richiamare pitone nel seguente modo:

python setup.py build_ext --build-lib <build directory> 

Io uso le seguenti fare le regole per automatizzare questo:

python_lib_dir=src/lib 

cython_output = $(patsubst $(python_lib_dir)/%.pyx,$(python_lib_dir)/%.so, $(shell find $(python_lib_dir) -name '*.pyx')) 

$(cython_output):%.so:%.pyx  
    python setup.py build_ext --build-lib $(python_lib_dir)