2016-04-06 12 views
-1

Es tut mir leid, wenn die Frage scheint oft hier wiederholt, aber ich verbrachte den ganzen Tag ohne eine klare Antwort zu finden.Verwenden von C++ - DLLs in Python

Ich arbeite unter Visual Studio 2010 und ich versuche, eine in einer DLL definierte Klasse in Python zu laden. Ich habe gesehen, dass es keine Möglichkeit gibt, dies zu tun, ohne einen C++ - Wrapper zu erstellen (eventuell mit SWIG oder Boost.Python). Ich bin kein C++ - Programmierer und konnte zu Beginn keine einfache und übersichtliche Anleitung finden. Ich wäre Ihnen dankbar, wenn Sie mir einen einfachen geben könnten.

verwendet auch meine Klasse das Singleton-Muster, das wie folgt aus seiner Instantiierung zu einem Objekt beschränkt:

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

    return instance; 
} 

Ich muß also wissen, wie ich mit diesem in meinem Python-Skript umgehen kann, so dass ich eine erstellen Instanz von MyClass und greifen Sie auf alle Methoden zu.

Danke Jungs.

+0

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

+0

Sie haben uns außer Ihrem Kommentar fast nichts über Ihr Szenario erzählt über Singletons. Mit was genau kämpfst du, das ist nicht schon viel besser beschrieben als ich in http://www.swig.org/Doc3.0/SWIGPlus.html? – Flexo

+0

Eigentlich ist der Teil über Singletons, den ich gepostet habe, was ich am meisten brauche. Ich weiß nicht, wie man in Python mit Zeigern umgeht.Zum Beispiel würde ich so etwas wie: _import MyDLL_ _instance = MyDLL.getInstance() _ _instance.someMethod() _ Aber ich bin nicht sicher, dass es so einfach sein wird .. –

Antwort

0

Nachdem ich die Lösung für mein Problem gefunden habe, komme ich zurück, um meine Frage zu beantworten, wem es helfen könnte.

Ich verwendete SWIG, um den C++ - Wrapper zu erstellen. So definiert ich die Modul-Schnittstelle so etwas wie:

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

Dann kompiliert direkt mit:

>swig -c++ -python MyClass.i 

Und das erzeugt zwei Dateien: MyClass.py und MyClass_wrap.cxx.

I enthielt dann die MyClass_wrap.cxx Datei auf mein Projekt in Visual Studio und machte diese Änderungen auf meiner Projekteigenschaft:

Konfigurationseigenschaften> Allgemein> Zielname: _MyClass Zielerweiterung: .pyd

C/C++> Allgemein> Zusätzliche Includeverzeichnisse: /path/to/Python/include

Linkers> Additiona l Bibliotheksverzeichnisse: // path/to/Python/libs

Und dann das Projekt zusammengestellt zu generieren _MyClass.pyd.

In meinem Python-Skript, es ist so einfach wie die folgenden:

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

Das ist alles. SWIG erledigt all die Arbeit, um den von getInstance() zurückgegebenen Verweis zu verarbeiten.

Verwandte Themen