2015-12-17 23 views
12

Wygląda na to, że domyślnie konfiguracja z distutils.core z cmdclass ustawionym na build_ext, kompiluje plik cpp lub cw bieżącym katalogu roboczym. Czy istnieje sposób na określenie, skąd generowany kod c jest zapisywany? W przeciwnym razie repozytorium będzie zaśmiecone wygenerowanym kodem.Określ plik wyjściowy cythonu

Na przykład ten plik setup.py napisze przyklad.c plik do bieżącego katalogu roboczego:

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

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

Odpowiedz

7

można przekazać opcję build_dir="directory name" do Cythonize

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

Powyższy kod umieść wygenerowane pliki c w katalogu "build" (co ma sens, ponieważ domyślnie jest to miejsce, w którym distutils umieszcza tymczasowe pliki obiektów i tak dalej, gdy buduje).


Moja odpowiedź oryginalny, nie miał workingbuild_dir. Dzięki @ArthurTacca za wskazanie, że nie wydaje się już właściwe.

+1

Poprawna opcja wydaje się być "build_dir" nie "działa". Być może to się zmieniło w najnowszej wersji Cythona. Aby uniknąć konfliktów z innymi plikami kompilacji, najlepiej nie używać po prostu "kompilacji". Podfolder taki jak "build/cython" byłby lepszy. –

+0

Na pierwszy rzut oka wyglądasz dobrze - dzięki. Patrząc na kod na githubie, nie widzę, gdzie to się zmieniło od 2015 roku, więc kto wie, skąd go wziąłem (ale wyobrażam sobie, że musiało to zadziałać w tym czasie ...). Zaktualizuję go, gdy potwierdzę, że działa. – DavidW

3

po inicjalizacji rozszerzenia parametry można ustawić tak, aby tworzyły cw katalogu tymczasowym.

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

Myślę, że jest to nieco lepsze rozwiązanie niż moja odpowiedź. – DavidW

1

Twój plik setup.py jest w porządku.

aby ją zbudować w innym miejscu, należy wywołać Pythona w następujący sposób:

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

używam następujące dostosowania przepisów do zautomatyzowania to:

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)