簡體   English   中英

如何將scipy.weave.inline與外部C庫一起使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM