2010-11-23 7 views
7

PythonプログラムでCコードをラップするためにweave.inlineを理解しようとしています。以下のコードは、単にscipy.weave.inlineを外部のCライブラリと一緒に使うには?

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 

その後、私は外部のライブラリにインラインコードからいくつかの機能を実行したいinl.py 2.

によってnumpyのアレイとmultiplicatesその要素のすべてを取ります。

#include "mult.h" 

float mult(float n) 
{ 
    return n * 2; 
} 

mult.h

float inc(float n); 

は、今私は、関数MULTを使用したい

mult.c:だから私は2つのファイルを作成し、それは2によってささいな乗算とします私のインラインコードで。しかし、どのように私のCファイルをPythonのインラインコードとリンクさせるのか分かりません。私は共有ライブラリとしてCファイルをコンパイルしようとし、それらをヘッダとライブラリとして渡しましたが、それは無駄でした。助言がありますか?

答えて

7

を楽しむ私は正常に(Ubuntu Linuxの下)weave.inline()のコードを経由してRから数学関数を呼び出して、これを行っています。

まず、C関数を共有ライブラリとしてコンパイルします。私の場合、私はCRANからRの最新リリースをつかんで、そして

./configure --enable-R-static-lib --enable-static --with-readline=no 
cd src/nmath/standalone/ 
make 

あなたは今libRmath.soと呼ばれるファイルを持っている必要がありますをしました。 libpathlibRmath.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]) 

ような何かを行うことができますカップルの事に注意してください。ヘッダーの宣言はcodeではなくsupport_codeでなければなりません。なぜなら、C++ではなくC++であるからです(接頭辞はextern "C")。 support_code(weave.inlineのドキュメントをチェックしてください)の代わりにヘッダーファイルを含めることは可能ですが、試していません。ライブラリ名はRmathですが、通常のUnixの規則では共有ライブラリファイルはlibRmath.soです。また、ライブラリへのパスは、リンクのために1回、実行のために1回、2回指定されます。

希望すると便利です。

1

申し訳ありませんが、私はweaveでそれを行う方法がわかりません。 ただし、SO simple-wrapping-of-c-code-with-cythonを参照してください。

+0

私はCython、ctypes、SWIGなどのC/Pythonバインディングを試しました。織り方は、Numpy配列をCに渡す最も簡単な方法のように見えるので、コード内に外部ライブラリを使用する方法を探したいと思います。また、すでにCコードを織り込んでいます。うまく動作します。とにかくありがとうございました。 – user517893

1

は、次のように標準ライブラリを含めるためのオプションもあり、extra_codeと呼ばれる文字列オブジェクトに、あなたの.weave呼び出しに次の行を追加します

support_code=extra_code, 

をmult.cとmult.hのソースを入れて:

headers = ["<math.h>"] 

関連する問題