我正在使用 Cython 作为由 CMake 驱动的大型项目的构建设置的一部分。我似乎无法让 Cython.c在合理的位置生成文件。我的文件布局:C:\mypath\src\demo.py # Cython source fileC:\mypath\build\bin # I want demo.pyd to end up hereC:\mypath\build\projects\cyt\setup.py # Generated by CMakeMysetup.py是由 CMake 生成的(很多取决于configure_file),位于上面指定的位置。这个位置符合总体项目的通常结构(它构建了一百多个库和可执行文件)并且不是我想要(或可以轻松)更改的。生成的setup.py看起来像这样:from distutils.core import setup, Extensionfrom Cython.Build import cythonizeimport os.pathextension_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\cytpython 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又非常脆弱。我希望存在更好的解决方案。
添加回答
举报
0/150
提交
取消