我似乎无法让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.exp
和
demo.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源代码的检查来看,这不适用于
电话)。
我尝试使用绝对路径
来源
demo.py
,
在…内
C:\src\demo.c
).
我的问题:
如何确保所有生成的中间文件(C、obj和friends)都与生成的文件位于同一目录中
setup.py
我可以为我的情况想出两种变通方法,但它们都感觉像是我想要避免的黑客行为:
-
从中的位置复制所有Python源文件
C:\mypath\src
setup.py
,以便我可以在没有
..
在小路上。
这可能会解决问题,但我宁愿避免在(已经很长的)构建过程中增加数十个额外的文件复制操作。
-
因为文件结束的路径似乎是通过连接“目录
setup.py
+价值
建立目录
+价值
“,我可以数一数
..
来源
路径并指定
足够深,以使评估结果符合我实际需要的路径。
这是非常粗糙和非常脆弱的。
我希望有更好的解决办法。