如何为 AOT 编译的 numba 扩展指定目标目录?



我正在尝试使用numba为项目创建一些AOT编译的python代码。

我想将所有源代码放在一个特定的目录中,然后使用这些源代码通过不同目录中的传统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/文件夹中。

- 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.py编译时,output_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构建源代码时如何在目标目录下构建模块的建议将不胜感激。谢谢!

这个有点棘手(就像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(),它会同时编译。

最新更新