我试图了解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。但是我不知道如何用Python内联代码链接C文件。我试图将C文件编译为共享库,然后将它们作为头文件和库进行传递,但这是徒劳的。有什么建议?

最佳答案

我已经成功地做到了这一点,通过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/

10-11 23:03