2016-04-06 16 views
-1

質問がここで何度も繰り返されているようですが、私は明確な答えを見つけることなく1日中過ごしました。PythonでのC++ DLLの使用

私はVisual Studio 2010で作業していますが、DLLで定義されたクラスをPythonにロードしようとしています。私は、C++ラッパー(最終的にSWIGまたはBoost.Pythonを使用)を作成せずにこれを行う方法はないことを知りました。私はC++のプログラマーではなく、まずは簡単で分かりやすいチュートリアルを見つけることができませんでした。私にシンプルなものを教えていただければ幸いです。だから私は、私が作成できるように、私は私のPythonスクリプトでこれに対処する方法を知っておく必要があり

MyClass* MyClass::getInstance() 
{ 
    if(instance==NULL)     
     instance = new MyClass();  

    return instance; 
} 

はまた、私のクラスでは、このような一つのオブジェクトにそのインスタンス化を制限シングルトンパターンを使用していますMyClassのインスタンスを作成し、すべてのメソッドにアクセスします。

ありがとうございます。

+0

http://www.boost.org/doc/libs/1_42_0/libs/python/doc/tutorial/doc/html/index.html – neohope

+0

あなたのシナリオについては、1つのコメントシングルトンについてあなたが苦労していることは、http://www.swig.org/Doc3.0/SWIGPlus.htmlで私ができるよりもはるかに良く説明されていませんか? – Flexo

+0

実際に私が投稿したシングルトンについての部分は、私が最も必要とするものです。私はPythonでポインタを扱う方法を知らない。例えば、私は次のようなことをします: _import MyDLL_ _instance = MyDLL.getInstance()_ _instance.someMethod()_ しかし、私はそれが簡単なことは分かりません。 –

答えて

0

私の問題の解決策を見つけた後、私はそれが助けになる人に私の質問に答えるために戻ってきます。

SWIGを使ってC++ラッパーを作成しました。だから私は、モジュールインターフェースを定義したようなもの:

%module MyClass 
    %{ 
    #include "MyClass.h" 
    %} 
    %include <windows.i> //if you're using __declspec(dllexport) to export dll 
    %include "MyClass.h" 

は、その後にそれを直接コンパイル:

>swig -c++ -python MyClass.i 

そして、それは二つのファイルを生成:MyClass.pyMyClass_wrap.cxxを。

は、私は、Visual Studioでの私のプロジェクトにMyClass_wrap.cxxファイルを含め、私のプロジェクトのプロパティでこれらの変更を加えた:

構成プロパティ>一般>ターゲット名:_MyClass 対象拡張子:.pyd

C/C++>全般>追加は、インクルードディレクトリ:/パス/に/ Pythonの/は

リンカ> Additionaが含まれますその後、//パス/に/ Pythonの/ libsに

そして_MyClass.pydを生成するプロジェクトをコンパイルします。lライブラリディレクトリ。私のPythonスクリプトで

、それは次のように簡単です:

import MyClass 
instance = MyClass.MyClass.getInstance() 
#and then use all MyClass methods via instance, ex: instance.SomeMethod() 

すべてですこと。 SWIGは、getInstance()によって返された参照を処理するためのすべての作業を行います。

関連する問題