我正在尝试使用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/
文件夹中。根据参考手册,numba
AOT 编译器提供了分别通过CC
实例属性output_dir
和output_file
指定将在其中构建扩展的输出目录名称和文件名的选项。但这只有在我通过调用CC
函数compile()
来自己编译代码时才有效。当代码由setup.py
编译时,output_dir
和output_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()
,它会同时编译。