gpt4 book ai didi

python - 我可以精确控制cythonize生成的.c文件的位置吗?

转载 作者:太空狗 更新时间:2023-10-30 01:18:15 64 4
gpt4 key购买 nike

我将 Cython 用作由 CMake 驱动的大型项目的build设置的一部分。我似乎无法让 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 )。此位置符合总体项目(构建了一百多个库和可执行文件)的通常结构,我不想(或可以轻松)更改。

生成的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.expdemo.lib , 结束于 C:\mypath\build\projects\src .我想要它们在里面 cyt .
  • C 文件 demo.c结束于 C:\mypath\build\src .同样,我想要这个在 projects\cyt 中.

setup.py , 我正在设置 build_dir cythonize 的参数正如 this answer 中所建议的那样,但它似乎并没有像我想要的那样工作。我也尝试使用 cython_c_in_temp根据 another answer在那个问题上,但这没有效果(从我对 Cython 源代码的检查来看,根本不适用于 cythonize 调用)。

我尝试为 source 使用绝对路径,但这让事情变得更糟,因为 C 文件最终生成在 demo.py 旁边, 源代码树中(如 C:\src\demo.c )。

我的问题:我如何确保所有生成的中间文件(C、obj 和 friend )最终与生成的 setup.py 位于同一目录中,还是低于那个?


对于我的情况,我可以想到两种解决方法,但它们都像是我想避免的 hack:

  1. C:\mypath\src 中的位置复制所有 Python 源文件与生成的 setup.py 并排, 这样我就可以在没有 .. 的情况下引用它们在路径中。这可能会解决问题,但会增加(已经很长的)构建过程的负担,因为我宁愿避免数十个额外的文件复制操作。
  2. 由于文件最终到达的路径似乎是由“setup.py 的目录+ build_dir 的值+ source 的值”连接而成,所以我可以数出.. 的数量。在source路径并指定 build_dir足够深,以便评估结果符合我真正想要的路径。这既非常骇人听闻又非常脆弱。

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

最佳答案

看来您遇到了错误。这是相关的 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).

关于python - 我可以精确控制cythonize生成的.c文件的位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53744729/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com