【问题标题】:Specify cython output file指定 cython 输出文件
【发布时间】:2015-12-17 21:52:26
【问题描述】:

似乎默认情况下,从 distutils.core 设置的 cmdclass 设置为 build_ext,在当前工作目录中编译 cpp 或 c 文件。有没有办法确定生成的 c 代码的写入位置?否则,存储库中会堆满生成的代码。

例如这个文件 setup.py 会写一个文件 example.c 到当前工作目录:

from distutils.core import setup
from Cython.Build import cythonize

setup(
      ext_modules = cythonize("example.pyx"))

【问题讨论】:

    标签: python c++ cython


    【解决方案1】:

    您可以将选项build_dir="directory name" 传递给Cythonize

    # rest of file as before
    setup(
          ext_modules = cythonize("example.pyx",
                                  build_dir="build"))
    

    上面的代码会将生成的 c 文件放在“build”目录中(这是有道理的,因为默认情况下它是 distutils 在构建时放置临时对象文件等的地方)。


    我原来的答案是working,而不是build_dir。感谢@ArthurTacca 指出这似乎不再正确。

    【讨论】:

    • 正确的选项似乎是“build_dir”而不是“工作”。也许它在最新版本的 Cython 中发生了变化。为避免与其他构建文件发生冲突,最好不要只使用“构建”。像“build/cython”这样的子目录会更好。
    • 一目了然,您看起来是对的 - 谢谢。查看 github 上的代码,我看不出它自 2015 年以来在哪里发生了变化,所以谁知道我从哪里得到它(但我想它当时一定有效......)。一旦我确认它确实有效,我会更新它。
    • 但是如何指定构建.so文件的路径?
    【解决方案2】:

    初始化一个Extension后,可以设置参数在temp目录下创建c。

     module  = Extension("temp", "temp.pyx")
     module.cython_c_in_temp = True 
    

    【讨论】:

    • 我认为这比我的回答稍微好一点。
    • 此解决方案也解决了我的问题,但正在向任何地方记录的Extension 添加属性?
    • 不,但我们一直在 cython 中做类似的事情。当我有机会时,我们应该记录所有选项
    【解决方案3】:

    你的 setup.py 没问题。

    要让它构建到不同的位置,请按以下方式调用 python:

    python setup.py build_ext --build-lib <build directory>
    

    我使用以下 make 规则来自动执行此操作:

    python_lib_dir=src/lib
    
    cython_output = $(patsubst $(python_lib_dir)/%.pyx,$(python_lib_dir)/%.so, $(shell find $(python_lib_dir) -name '*.pyx'))
    
    $(cython_output):%.so:%.pyx      
        python setup.py build_ext --build-lib $(python_lib_dir)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多