use*_*893 7 c python inline scipy
我试图理解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
Run Code Online (Sandbox Code Playgroud)
然后我想将内联代码中的一些函数传递给外部库.让它成为2的琐碎乘法.所以我创建了两个文件:
mult.c
#include "mult.h"
float mult(float n)
{
return n * 2;
}
Run Code Online (Sandbox Code Playgroud)
mult.h
float inc(float n);
Run Code Online (Sandbox Code Playgroud)
现在我想在我的内联代码中使用函数mult.但我不知道如何将我的C文件与Python内联代码链接起来.我试图将C文件编译为共享库,并将它们作为头文件和库传递,但这是徒劳的.有什么建议?
小智 7
我已成功完成此操作,通过weave.inline()代码(在Ubuntu Linux下)从R调用数学函数.
首先,将C函数编译为共享库.就我而言,我从CRAN手中抢到了最近发布的R版本
./configure --enable-R-static-lib --enable-static --with-readline=no
cd src/nmath/standalone/
make
Run Code Online (Sandbox Code Playgroud)
你现在应该有一个名为的文件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])
Run Code Online (Sandbox Code Playgroud)
注意几件事.头文件声明必须进入support_code,而不是code(我不知道为什么),并且它们必须带有前缀,extern "C"因为它们是C代码,而不是C++(这是标准的).应该可以包含头文件而不是使用support_code(检查weave.inline的文档),但我还没有尝试过.库名是Rmath,但共享库文件是libRmath.so通常的Unix惯例.并且指定库的路径两次,一次用于链接,一次用于执行.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4511 次 |
| 最近记录: |