[英]How do I use scipy.weave.inline together with external C libraries?
我試圖理解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 = ["<math.h>"]
請享用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.