如何使用scipy.weave.inline与外部C库一起使用?

2024-10-09 20:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试图理解编织.inline在Python程序中包装C代码。下面的代码简单地接受Numpy数组并将其所有元素乘以2。在

内页

import numpy
import scipy.weave

a = numpy.array([1.0, 2.0, 3.0])
N = a.shape[0]

print a
code = \
  """
  int i;
  for(i = 0; i < N; i++)
  {
    a[i] = a[i] * 2;
  }
  """

scipy.weave.inline(code, ['a','N'])
print a

然后我想把一些函数从内联代码带到外部库。让它成为2的微不足道的乘法。所以我创建了两个文件:

mult.c

^{pr2}$

mult.h

float inc(float n);

现在我想在内联代码中使用mult函数。但我不知道如何将C文件与Python内联代码链接起来。我试图将C文件编译为共享库,并将它们作为头和库传递给weave,但这是徒劳的。有什么建议吗?在


Tags: 文件函数代码import程序numpyinlinecode
2条回答

我已经成功地做到了,从R via调用数学函数编织.inline()代码(在Ubuntu Linux下)。在

首先,将C函数编译为共享库。在我的例子中,我从CRAN抓取了一个R的最新版本

./configure  enable-R-static-lib  enable-static  with-readline=no
cd src/nmath/standalone/
make

现在应该有一个名为libRmath.so的文件。如果libpath是一个包含libRmath.so目录的字符串,可以执行如下操作

^{pr2}$

注意几点。报头声明必须在^ {< CD4> }中,而不是^ {< CD5> }(我不知道为什么),它们必须用^ {CD6}}前缀,因为它们是C代码,而不是C++(这是标准的)。应该可以包含头文件,而不是使用support_code(检查文档中的编织.inline),但我还没试过。库名是Rmath,但共享库文件是libRmath.so,这是通常的Unix约定。库的路径被指定两次,一次用于链接,一次用于执行。在

希望这有帮助!在

将mult.c和mult.h的源代码放入名为extra_code的字符串对象中,然后在.weave调用中添加以下行

support_code=extra_code,

还可以选择包括以下标准库:

^{pr2}$

享受

相关问题 更多 >

    热门问题