Укажите выходной файл cython

Кажется, что по умолчанию setup из distutils.core с cmdclass, установленным в build_ext, компилирует файл cpp или c в текущем рабочем каталоге. Есть ли способ определить, где сгенерирован сгенерированный код c? В противном случае репозиторий будет усеян сгенерированным кодом.

Например, этот файл setup.py напишет файл example.c в текущий рабочий каталог:

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

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

Ответ 1

Вы можете передать опцию build_dir="directory name" в Cythonize

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

Вышеприведенный код поместит сгенерированные c файлы в каталог "build" (что имеет смысл, поскольку по умолчанию это где distutils помещает временные файлы объектов и т.д. При его создании).


Мой первоначальный ответ working, а не build_dir. Благодаря @ArthurTacca за то, что он больше не кажется правильным.

Ответ 2

после инициализации расширения параметры могут быть установлены для создания c в каталоге temp.

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

Ответ 3

Ваш setup.py в порядке.

Чтобы заставить его строить в другое место, вызовите python следующим образом:

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

Я использую следующие правила make для автоматизации этого:

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)