python - 如何为 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/
文件夹中。根据参考手册,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()
推荐阅读
- c++ - 如何在没有高 CPU 使用率的情况下检测 Windows 中的按键?
- python - ValueError: 操作数不能与形状 (100,) (99,) 一起在 Python 中广播错误
- javascript - 如何在每组之间延迟发出特定缓冲区大小的值
- r - 为什么这个闪亮的应用程序可以在 ShinyApps.io 上运行,但不能在 Shiny Server 上运行?
- r - 我如何使用数据框中的值在 ggplot 2 中绘制图形并将它们转换为四舍五入的百分比标签
- java - document.getMetadata().hasPendingWrites() 显示为真,因为数据未存储在 Firebase 中
- javascript - 将嵌套数组转换为普通数组
- mysql - XAMPP MySQL 意外关闭
- postgresql - 无法使用 pgAdmin 访问 RDS 上的 Db 实例
- javascript - 延迟加载不适用于图像滑块插件(WordPress、PHP、JavaScript)