我正在使用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
我的setup.py
是由CMake (很大一部分依赖于configure_file
)在上面指定的位置生成的。这个位置符合拱顶项目的通常结构(构建了超过100个库和可执行文件),并且不是我想要(或可以很容易)改变的。
生成的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}
)
setup(name = 'demo',
version = '0.1',
description = '',
ext_modules = modules)
(请注意,与实际情况相比,这大大简化了,实际情况在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
.demo.c
最终在C:\mypath\build\src
中。同样,我想在projects\cyt
.中实现这一点
在setup.py
中,我按照this answer中的建议为cythonize
设置了build_dir
参数,但它似乎并不像我希望的那样工作。在这个问题上,我也尝试按照another answer使用cython_c_in_temp
,但没有效果(从我对Cython源代码的检查来看,它根本不适用于cythonize
调用)。
我尝试使用source
的绝对路径,但这使事情变得更糟,因为C文件最终在源码树中的demo.py
旁边生成(作为C:\src\demo.c
)。
我的问题:如何确保所有生成的中间文件(C、obj和朋友)最终都与生成的setup.py
位于同一目录中,或者位于该目录之下?
我可以为我的情况想出两种解决办法,但它们都感觉像是我想要避免的黑客:
C:\mypath\src
中的位置复制到生成的setup.py
旁边,这样我就可以在路径中没有..
的情况下引用它们。setup.py
的目录+ build_dir
的值+source
的值”组成的,所以我可以计算source
路径中的..
的数量,并指定足够深的build_dir
,以便计算得到我真正想要的路径。这既非常老生常谈,又非常脆弱。我希望有更好的解决方案。
发布于 2018-12-18 07:48:23
所以看起来你遇到了一个bug。下面是相关的section of code in Cython。基本上,cythonize
会尝试构建.c
和.o
文件的路径,如下所示:
C:/mypath/build/projects/cyt/BUILD_DIR/../../../src/demo.c
因此,不是包含良好的临时文件,而是以疯狂告终。使用demo.py
的绝对路径也不会有什么帮助,因为相同的代码只会传递未更改的绝对路径。
除了广泛的猴子补丁之外,似乎没有办法在用户空间修复这个问题,所以我提交了一个pull-request to Cython with an actual fix。一旦被合并,你就应该能够运行:
cd C:\mypath\build\projects\cyt
python setup.py build_ext -b C:/mypath/build/bin -t .
以获得您想要的结果(-b
和-t
是--build-lib
和--build-temp
的缩写)。
https://stackoverflow.com/questions/53744729
复制相似问题