Can I achieve precise control over location of .c files generated by cythonize?
我正在使用Cython作为CMake驱动的大型项目的构建设置的一部分。
我似乎无法让Cython在合理的位置生成
我的文件布局:
1 2 3 | 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 |
我的
此位置符合总体项目的常规结构(该结构构建了一百多个库和可执行文件),不是我想要(或可以轻松)更改的内容。
生成的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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) |
(请注意,与实际情况相比,此方法已大大简化,后者在
但是,我已经验证了上面的最小化版本会重现我的问题。
Cython的运行方式如下:
1 2 | 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文件等)构建工件,并将其放置在
但是,我似乎无法实现这一目标。
这是构建伪像实际结束的地方:
-
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 中使用它。
在
我还尝试使用
我尝试为
我的问题:如何确保所有生成的中间文件(C,obj和Friends)与生成的
我可以针对我的情况考虑两种解决方法,但是它们都像黑客一样,我想避免:
那可能会解决该问题,但是我宁愿避免使用数十个其他文件复制操作来负担(已经很长的)构建过程的负担。
这既非常hacky,又非常脆弱。
我希望有更好的解决方案。
所以看来您遇到了一个错误。这是Cython中代码的相关部分。基本上,
1 | C:/mypath/build/projects/cyt/BUILD_DIR/../../../src/demo.c |
,因此您没有很好地包含临时文件,而最终陷入了疯狂。使用
在没有大量猴子修补程序的用户空间中,似乎没有办法解决此问题,因此我向Cython提出了一个拉动请求,并进行了实际修复。合并后,您应该可以运行:
1 2 | cd C:\\mypath\\build\\projects\\cyt python setup.py build_ext -b C:/mypath/build/bin -t . |
以获得所需的结果(