代码之家  ›  专栏  ›  技术社区  ›  Angew is no longer proud of SO

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

  •  4
  • Angew is no longer proud of SO  · 技术社区  · 6 年前

    我似乎无法让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


    我可以为我的情况想出两种变通方法,但它们都感觉像是我想要避免的黑客行为:

    1. 从中的位置复制所有Python源文件 C:\mypath\src setup.py ,以便我可以在没有 .. 在小路上。 这可能会解决问题,但我宁愿避免在(已经很长的)构建过程中增加数十个额外的文件复制操作。
    2. 因为文件结束的路径似乎是通过连接“目录 setup.py +价值 建立目录 +价值 “,我可以数一数 .. 来源 路径并指定 足够深,以使评估结果符合我实际需要的路径。 这是非常粗糙和非常脆弱的。

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   tel    6 年前

    看来你遇到了一只虫子。这是相关的 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 ).