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

标签 python c inline scipy

我正在尝试理解 weave.inline 以将 C 代码包装在我的 Python 程序中。下面的代码只是获取 Numpy 数组并将其所有元素乘以 2。

inl.py

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

#include "mult.h"

float mult(float n)
{
  return n * 2;
}

mult.h

float inc(float n);

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

最佳答案

我已经成功地做到了这一点,通过 weave.inline() 代码(在 Ubuntu Linux 下)从 R 调用数学函数。

首先,将您的 C 函数编译为共享库。就我而言,我从 CRAN 获取了 R 的最新版本,并做了

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

您现在应该有一个名为 libRmath.so 的文件.如果libpath是一个包含目录的字符串 libRmath.so ,你可以做类似的事情

code = 'return_val = pbinom(100, 20000, 100./20000., 0, 1);'
support_code = 'extern "C" double pbinom(double x, double n, double p, int lower_tail, int log_p);'
weave.inline(code, support_code=support_code,
    library_dirs=[libpath], libraries=["Rmath"], runtime_library_dirs=[libpath])

注意几件事。 header 声明必须放在 support_code 中, 不是 code (我不知道为什么),他们必须以extern "C"为前缀因为它们是 C 代码,而不是 C++(这是标准的)。应该可以包含头文件而不是使用 support_code (检查 weave.inline 的文档),但我还没有尝试过。库名称是 Rmath , 但共享库文件是 libRmath.so , 在通常的 Unix 约定中。库的路径指定了两次,一次用于链接,一次用于执行。

希望这对您有所帮助!

关于python - 如何将 scipy.weave.inline 与外部 C 库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4260528/

相关文章:

python - 我怎样才能随机放置几个非碰撞矩形?

c - 如何将链表拆分为两个列表

python - 删除各个子目录中相同的文件名

python - 如何在 PyPy 上使用 Biopython?

networking - 在调用 recvfrom() 时使用什么字节序来存储信息

C++ 做内联函数防止复制?

c++ - inline的标准是什么

css - HTML,3 列布局

python - 矩阵标量乘法

c - 为什么c语言中 printf ("%d","") 的输出是173?