似乎默认情况下,从 distutils.core 设置为 build_ext,将 cmdclass 设置为当前工作目录中的 .cpp 或 .c 文件。有没有办法确定生成的 C 代码写入何处?否则,存储库将充斥着生成的代码。
例如,此文件 setup.py 会将文件 example.c 写入当前工作目录:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("example.pyx"))
您可以将选项
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 指出这似乎不再正确。
初始化扩展后,可以设置参数在临时目录中创建c。
module = Extension("temp", "temp.pyx")
module.cython_c_in_temp = True
你的 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)