2016-03-28 10 views
0

NumPyから呼び出す必要のあるライブラリを持つC/C++ DLLがあります。NumPyからDLLの形式はすべてboost :: multi_array形式です。このプロジェクトを含むいくつかの記事を見てきましたが、https://github.com/mdboom/numpy-boost このライブラリを使ってNumPyインターフェイスにboost :: multi_arrayをラップするために必要な手順については、そこにあるユーザーからの資料や例はほとんどありません。私の質問:例では、文字列以外のインターフェイスのC++部分を推測するのに十分ですが、コンパイルされたDLL(Q2)を使用するにはPython側で何をする必要がありますか?それはCtypesが動作しない(私が間違っている場合は私を修正する)ようですので、これはCythonで書き直さなければならないのですか?参考のためPython NumPy配列をboost :: multi_array numpy_boostをC++とNumPy間のインターフェイスに設定する

、これは私がラップしようとしているすべてのデータ型とCの一部です:ctypesので

extern "C" 
{ 
    DECLDIR void Cfunction(
     boost::multi_array<double, 2>& p_result, 
     const vector<string>&   p_calcType, 
     const string&     p_optionType, 
     unsigned long     p_nTimeStep = 50, 
     const vector<double>&   p_premium = vector<double>()); 

答えて

0

あなたが動的にDLLをロードし、それから関数を呼び出すことができます。私の視点からは、Pythonコード内でコンパイルされたコードを使用する最も簡単な方法です。方法は次のとおりです。How can I use a DLL file from Python?

numpyを使用すると、メモリ位置へのポインタを取得できます。その時に見て:http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.ctypes.html

あなたのDLLのソースコードを持っていないし、そのインターフェイスを変更できない場合は、Pythonの代わりにboost::multi_arrayからの生のポインタを受け取りC++ラッパー(自分の別のDLL)を作成します。

+0

ありがとうございました。以前の投稿を見ていただきありがとうございます。私はDLLのソースコードにアクセスできません.3番目のポイントでは、基本的にどこに向かうのですか。 boost :: multi_array DLLにリンクする新しいC++ DLLを作成し、NumPyポインタを使用してctypesに必要なデータ形式を取得しますか? – Matt

+0

@Matt既知の形状(寸法)を持つ生のポインタを 'boost :: multi_array'として解釈(または変換)することができれば、同様の機能を持ちながらポインタと次元を単純なC型として受け付ける独自のDLLを作成することができます。サードパーティDLLから関数を呼び出します。このDLLを作成することは、Python、他のライブラリやその他の機能拡張と共通するものではありません。 –

+0

私はあなたにとっては簡単かもしれないと信じていますが、私は単純にNumPyをマップしているテンプレートライブラリを使用して、単にctypesの別のラッパーを記述することなく直接:: multi_arrayを増やそうとしています。しかし、私はあなたが私に、おそらくこれに近づく方法を考えさせてくれたと思います... – Matt

関連する問題