首页 > 解决方案 > 如何为 AOT 编译的 numba 扩展指定目标目录?

问题描述

我正在尝试为使用numba.

我想将我所有的源代码放在一个特定的目录中,然后使用这些通过常规setup.py在不同的目录中构建编译的代码。例如,假设我的项目结构如下

- numba_project/
    - numba_project/
        - __init__.py
        - src/
            - numba_source.py
        - lib/
    - setup.py

看起来numba_source.py

from numba.pycc import CC

cc = CC('my_module')

@cc.export('mul_f', 'f8(f8, f8)')
def mul(a, b):

    return a*b

cc.compile()

setup.py看起来像这样

import setuptools
from numpy.distutils.core import setup
from numba_project.src.numba_source import cc

setup(
        name = 'my_numba_examples',
        # other setup arguments,
        ext_modules = [cc.distutils_extension()]
     )

现在,当我通过build_ext命令构建扩展模块时,我的扩展模块被构建到src/文件夹中。IE,

- numba_project/
    - numba_project/
        - __init__.py
        - src/
            - numba_source.py
            - my_module.so
        - lib/
    - setup.py

但是,我想将扩展构建到lib/文件夹中。根据参考手册numbaAOT 编译器提供了选项来指定输出目录名和文件名,通过CC实例属性output_diroutput_file分别构建扩展名。但这只有在我通过调用CC函数自己编译代码时才有效compile()。当代码由 编译时setup.pyoutput_diroutput_file属性将被忽略。

所以,我目前无法为我的扩展指定目标目录。我在命名模块时尝试了 Python 点名(这是创建 C 或 Fortran 扩展时的标准,如此处所述),即类似

cc = CC('numba_project.lib.my_module')

但我收到以下错误

ValueError: basename should be a simple module name, not qualified name

在构建源代码时如何在目标目录下构建模块的任何建议setup.py将不胜感激。谢谢!

标签: pythonsetup.pynumbadistutilspython-packaging

解决方案


这个有点难以弄清楚(就像 Numba 的大多数 AOT 功能一样)。这一切都通过命令行(或将其放在您的 AOT 源文件中),编译得很好。如果您没有在其中放置 output_dir ,它将在您使用时使其位于当前位置cc.compile()

所以首先你应该创建一个 cc 实例,如:

from numba .pycc import CC
cc = CC('my_module') # name your module
cc.output_dir = 'C://Username//My_Name//my_output_dir//' # set the output directory

所有 CC 标志都以这种方式传递以进行 AOT 编译。您可以在最终执行以下操作之前在终端中输入:

cc.compile()

是的,我确信这就是输出 PYD 的所在。如果你想运行脚本,你也可以把它放在你的脚本中:if __name__ == "__main__":块下,它会同时编译。cc.compile()


推荐阅读