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

2024-10-02 02:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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如下所示:

^{pr2}$

(请注意,与实际情况相比,这种情况大大简化了,后者在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中,我想要它。没问题。在
  • {{{{cd11>与文件^{cd11>链接在一起。我要他们在里面cyt。在
  • C文件demo.c以^{结尾。再一次,我想要这个在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和friends)都与生成的setup.py位于同一目录中,或位于该目录下?在


对于我的情况,我可以想出两种解决方法,但它们都感觉像黑客攻击,我希望避免:

  1. 将所有Python源文件从它们在C:\mypath\src中的位置复制到生成的setup.py旁边,这样我就可以在路径中不使用..来引用它们。 这很可能会解决这个问题,但我宁愿避免几十个额外的文件复制操作,从而使构建过程(已经很长)负担过重。在
  2. 由于文件结束的路径似乎是通过连接“目录setup.py+值build_dir+值source”组成的,所以我可以计算source路径中..的数量,并指定足够深的build_dir,这样求值结果就得到了我真正想要的路径。 这是非常粗糙和非常脆弱。在

我希望有更好的解决办法。在


Tags: 文件pybuild路径srccmakesourcebin
1条回答
网友
1楼 · 发布于 2024-10-02 02:32:11

看来你碰到了一只虫子。这是相关的section of code in Cython。基本上,cythonize将尝试构建指向.c.o文件的路径,如下所示:

C:/mypath/build/projects/cyt/BUILD_DIR/../../../src/demo.c

因此,不是很好地包含临时文件,你最终会精神错乱。对demo.py使用绝对路径也没有帮助,因为相同的代码只会以不变的方式传递绝对路径。在

除了大量的monkey补丁之外,似乎没有一种方法可以在用户空间中修复这个问题,所以我提交了一个pull-request to Cython with an actual fix。合并后,您应该能够运行:

^{pr2}$

为了得到你想要的结果(-b-t build-lib build-temp)的缩写形式。在

相关问题 更多 >

    热门问题