Похоже, что по умолчанию установка из 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"))
24
Michael WS 18 Дек 2015 в 00:52

3 ответа

Лучший ответ

Вы можете передать параметр 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 за то, что он указал, что это больше не кажется правильным.

15
DavidW 21 Май 2017 в 07:43

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

 module  = Extension("temp", "temp.pyx")
 module.cython_c_in_temp = True 
11
Michael WS 1 Янв 2016 в 03:03

Ваш 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)
5
Anders Lindstrom 23 Июн 2016 в 10:31