首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我能精确控制cythonize生成的.c文件的位置吗?

我能精确控制cythonize生成的.c文件的位置吗?
EN

Stack Overflow用户
提问于 2018-12-12 22:01:26
回答 1查看 524关注 0票数 5

我正在使用Cython作为我的构建设置的一部分,用于一个由CMake驱动的大型项目。我似乎无法让Cython在一个合理的位置生成.c文件。

我的文件布局:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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的运行方式如下:

代码语言:javascript
复制
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.pydC:\mypath\build\bin中结束,这是我想要的。这里没有问题。
  • 对象文件demo.obj,以及链接的文件demo.expdemo.lib,最终都在C:\mypath\build\projects\src中。我希望它们在cyt.
  • The C文件中,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位于同一目录中,或者位于该目录之下?

我可以为我的情况想出两种解决办法,但它们都感觉像是我想要避免的黑客:

  1. 将所有Python源文件从它们在C:\mypath\src中的位置复制到生成的setup.py旁边,这样我就可以在路径中没有..的情况下引用它们。
  2. 因为文件结束的路径似乎是由“setup.py的目录+ build_dir的值+source的值”组成的,所以我可以计算source路径中的..的数量,并指定足够深的build_dir,以便计算得到我真正想要的路径。这既非常老生常谈,又非常脆弱。

我希望有更好的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 07:48:23

所以看起来你遇到了一个bug。下面是相关的section of code in Cython。基本上,cythonize会尝试构建.c.o文件的路径,如下所示:

代码语言:javascript
复制
C:/mypath/build/projects/cyt/BUILD_DIR/../../../src/demo.c

因此,不是包含良好的临时文件,而是以疯狂告终。使用demo.py的绝对路径也不会有什么帮助,因为相同的代码只会传递未更改的绝对路径。

除了广泛的猴子补丁之外,似乎没有办法在用户空间修复这个问题,所以我提交了一个pull-request to Cython with an actual fix。一旦被合并,你就应该能够运行:

代码语言:javascript
复制
cd C:\mypath\build\projects\cyt
python setup.py build_ext -b C:/mypath/build/bin -t .

以获得您想要的结果(-b-t--build-lib--build-temp的缩写)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53744729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档