Python+Numpy模块在自由帕斯卡中的应用

5
开发Python模块(.pyd)的自由Pascal相当简单,详见用Pascal开发Python模块。但如果要与Numpy接口,则不那么容易。
在使用C来与Numpy接口时,您必须将#include <numpy/arrayobject.h>添加到代码中,并在初始化函数中调用import_array();
是否有办法在Pascal中与Numpy接口?
编辑1
如在@wilberforce答案下的评论中提到的那样,在头文件中定义的import_array函数仅将multiarray.pyd模块导入当前解释器并进行一些检查。它很容易翻译成Pascal并且能够正常工作。
numpy C-API函数最初不会出现在pythonXX.dll中,因此它们不能静态链接。对于我而言,使用multiarray.pyd进行静态或动态链接无效。
因此,更新后的问题是:是否有办法从非C代码访问嵌入在multiarray.pyd中的C-API函数?

刚刚发现 Delphi 的“delayed”关键字,它允许您按需从外部库加载函数(d2010+)。在这种情况下,它可能起作用。我只使用免费的 Pascal,所以在它被实现之前... - hdrz
1个回答

1
把numpy库从Pascal的角度视为任何其他C库 - 您需要包含头文件并声明import_array为externalcdecl函数。这个指南涵盖了细节。
您已经需要完成其中一些步骤,以便编写Python扩展模块,以便您的Pascal代码可以使用Python API函数与Python对象交互。您可以在链接示例中看到cdecl; external PythonLib;修饰符中。在执行此操作时可能不清楚。

1
问题在于:(1)import_array 声明在 arrayobject.h 及其包含文件中,(2)没有任何 numpy 函数在 python dll 中声明,以及(3)使用 multiarray.pyd 作为外部函数是不起作用的。 - hdrz
import_array 被映射到 _import_array 函数,它实质上是导入 numpy 模块。也许如果我用 Pascal 重写这个函数就能行。 - hdrz
哦,我明白了 - 他们在一个生成的头文件中定义了一个静态_import_array - 这很糟糕!(虽然我相信他们有他们的理由。) - babbageclunk
看起来您需要用Pascal重新实现它 - 这应该是一个相当机械的翻译。您甚至可以将其作为头文件贡献回numpy,以与 https://github.com/numpy/numpy/blob/master/numpy/core/code_generators/generate_numpy_api.py 相同的方式生成。 - babbageclunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接