2011-08-25 17 views
5

PythonアプリケーションでC++ライブラリを使用しようとしています。私はPythonでdllを読み込むことはできますが、そのC++ dllの内部にあるクラスのインスタンスを作成し、そのonjectのメソッドを呼び出す方法についての解決策は見つかりませんでした。続きC++クラスのインスタンスを作成し、Pythonでメソッドを呼び出す

は私がやったことだと私は、次の

をしたい

My.dll

class MyClass 
{ 
    public: 
    MyMethod(int param); 
} 

Pythonコード

from ctypes import * 
myDll = windll.LoadLibrary("My.dll") 

内部のC++のコードをしたいです

myClassInstance = myDll.InstantiateMyClass() myClassInstance.MyMethod(5) 
+1

あなたはBoost :: Python –

+0

を見てください。このように異なるC++コンパイラを混ぜて使うことはできません。別の言語を使用することはできません。 [@CatPlusPlusに耳を傾けて、Pythonの種類の本格的なPython拡張を書いてください。](http://stackoverflow.com/questions/7196118/creating-an-instance-of-ac-class-and-calling-methods-on -it-in-python/7196380#7196380) –

答えて

5

でも可能ですが、確かにそれほど簡単ではありません。それははるかに簡単に使用することができます。 Boost.PythonまたはCythonを使用して、そのクラスをPython型として公開する適切なCPython拡張を作成します。

1

Ctypesを使用してC++ dllをロードすることは危険であり、いくつかの強力な制限があります。 C++で関数を 'extern "C"'として宣言していない限り、エクスポートされた関数名は宣言したものと同じではありません。これは純粋な関数でのみ可能であり、メンバ関数ではできません。 C++コンパイラは、「ネームマングリング」と呼ばれるものを実行します。http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2Bを参照してください。

私は2つのソリューションを提案する:あなたは純粋な機能を持ついくつかのC++のコードを書く

  1. は、あなたが必要とする機能を公開「のextern 『C』」と宣言しました。
  2. Cython http://cython.org/を使用することをお勧めします。特にhttp://docs.cython.org/src/userguide/wrapping_CPlusPlus.htmlをお勧めします。私はそれをたくさん使ってくれました。私にとっては、C++コードをPythonにラップするのに最適な方法です。

ADDITIONAL NOTES:

私はブーストのpythonにいくつかの回を試みたが、それは難しい使用することを発見しました。独自のビルドシステムがあり、コンパイルプロセスは非常に遅く、テンプレート構文のためコードが読みにくくなります。それは、後ろの文脈の後ろにあるPythonは非常にクールですが、私の意見では使用するのは難しいです。

また、私は非常に快適ではなかったSIPとSWIGを試しました。

本当にCythonを使用することをお勧めします。

+0

最初の行に "python"を意味しましたか?なぜサイモンが危険で制限されているのだろうと混乱しているのですが、(2)でそれをお勧めします。 (私はこれについて何も知らない...) –

+0

を修正しました。今それはctypesです。 – rocksportrocker

関連する問題