我使用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
如下所示:
(请注意,与实际情况相比,这种情况大大简化了,后者在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
中,我想要它。没问题。在cyt
。在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
位于同一目录中,或位于该目录下?在
对于我的情况,我可以想出两种解决方法,但它们都感觉像黑客攻击,我希望避免:
C:\mypath\src
中的位置复制到生成的setup.py
旁边,这样我就可以在路径中不使用..
来引用它们。
这很可能会解决这个问题,但我宁愿避免几十个额外的文件复制操作,从而使构建过程(已经很长)负担过重。在setup.py
+值build_dir
+值source
”组成的,所以我可以计算source
路径中..
的数量,并指定足够深的build_dir
,这样求值结果就得到了我真正想要的路径。
这是非常粗糙和非常脆弱。在我希望有更好的解决办法。在
看来你碰到了一只虫子。这是相关的section of code in Cython。基本上,
cythonize
将尝试构建指向.c
和.o
文件的路径,如下所示:因此,不是很好地包含临时文件,你最终会精神错乱。对
demo.py
使用绝对路径也没有帮助,因为相同的代码只会以不变的方式传递绝对路径。在除了大量的monkey补丁之外,似乎没有一种方法可以在用户空间中修复这个问题,所以我提交了一个pull-request to Cython with an actual fix。合并后,您应该能够运行:
^{pr2}$为了得到你想要的结果(
-b
和-t
是build-lib
和build-temp
)的缩写形式。在相关问题 更多 >
编程相关推荐