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

我试图理解weave.inline在我的Python程序中包装C代码。 下面的代码简单地使用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.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]) 

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

希望这可以帮助!

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

 support_code=extra_code, 

还可以选择包含标准库,如下所示:

 headers = [""] 

请享用