我正在使用 Cython 作为由 CMake 驱动的大型项目的构建设置的一部分。我似乎无法让 Cython.c在合理的位置生成文件。
我的文件布局:
C:\mypath\src\demo.py # Cython source file
C:\mypath\build\bin # I want demo.pyd to end up here
C:\mypath\build\projects\cyt\setup.py # Generated by CMake
Mysetup.py是由 CMake 生成的(很多取决于configure_file),位于上面指定的位置。这个位置符合总体项目的通常结构(它构建了一百多个库和可执行文件)并且不是我想要(或可以轻松)更改的。
生成的setup.py看起来像这样:
from distutils.core import setup, Extension
from Cython.Build import cythonize
import os.path
extension_args = {
'extra_compile_args' : ['/DWIN32','/DWIN64'],
'extra_link_args' : ['/MACHINE:X64'],
}
source = '../../../src/demo.py'
modules = [Extension(
os.path.splitext(os.path.basename(source))[0],
sources = [source],
**extension_args
)]
modules = cythonize(
modules,
build_dir = 'BUILD_DIR',
compiler_directives = {'language_level' : 2}
)
(请注意,与实际情况相比,这大大简化了,它在 中传递了许多附加参数extension_args,并包含许多source文件,每个文件在 中都有自己的对象modules。不过,我已经验证了上面的最小化版本重现了我的问题)。
Cython 是这样运行的:
cd C:\mypath\build\projects\cyt
python setup.py build_ext --build-lib C:/mypath/build/bin --build-temp C:/mypath/build/projects/cyt
理想情况下,我希望来自 Cython 的所有中间构建工件(生成的 C 文件、目标文件、exp 文件等)都驻留在C:\mypath\build\projects\cyt. 但是,我似乎无法做到这一点。这是构建人工制品实际结束的地方:
demo.pyd最终C:\mypath\build\bin在我想要的地方。这里没问题。
目标文件demo.obj,连同链接的文件demo.exp和demo.lib,以C:\mypath\build\projects\src. 我想要他们在里面cyt。
C 文件demo.c以C:\mypath\build\src. 再次,我想要这个在projects\cyt.
在 中setup.py,我正在按照本答案中的建议设置build_dir参数,但它似乎没有按照我的意愿工作。我使用还试图按照另一种答案对这个问题,但没有任何效果(从我的用Cython源代码的检查情况来看,并不适用于所有的呼叫)。cythonizecython_c_in_tempcythonize
我尝试为 使用绝对路径source,但这让事情变得更糟,因为 C 文件最终生成在源树 (as )内的demo.py,旁边。C:\src\demo.c
我的问题:如何确保所有生成的中间文件(C、obj 和朋友)最终与生成的setup.py.
我可以为我的情况想到两种解决方法,但它们都感觉像是我想避免的黑客:
从他们的位置Python源文件复制所有C:\mypath\src到一起产生的setup.py,这样我可以参考他们没有..路径。这可能会解决问题,但会增加(已经很长的)构建过程的负担,我宁愿避免进行数十个额外的文件复制操作。
由于在文件结束的路径似乎通过连接“的目录组成setup.py+价值build_dir+价值source”,我可以指望的数量..的source路径,并指定build_dir足够深,从而使评价结果显示路径I其实想要。这既非常hacky又非常脆弱。
我希望存在更好的解决方案。
相关分类