2016-04-06 4 views
-1

Прошу прощения, если вопрос повторяется много раз здесь, но я провел целый день, не набрав ясного ответа.Использование C++ DLL в Python

Я работаю в Visual Studio 2010, и я пытаюсь загрузить класс, определенный в DLL, в Python. Я видел, что сделать это невозможно без создания C++-оболочки (с использованием SWIG или Boost.Python). Я не программист на C++, и я не мог найти простой и понятный учебник для начала, я буду благодарен, если вы можете дать мне простой.

Кроме того, мой класс использует шаблон одноэлементный, который ограничивает его экземпляр к одному объекту, как это:

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

    return instance; 
} 

Так что мне нужно знать, как я могу иметь дело с этим в моем сценарии Python, так что я могу создать экземпляр MyClass и доступ ко всем его методам.

Спасибо, ребята.

+0

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

+0

Вы почти ничего не рассказали о своем сценарии, кроме одного комментария о синглетонах. Что именно вы боретесь с этим, еще не описано намного лучше, чем я мог в 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.py и MyClass_wrap.cxx.

Затем я включил файл MyClass_wrap.cxx в мой проект в Visual Studio и внес эти изменения в моих свойствах проекта:

свойств конфигурации> Общий> Target Name: _MyClass Цель Расширение: .pyd

C/C++> Общие> Additional Include Directories: /путь/к/Python/включить

Linker> Additiona л Библиотека Справочники: // путь/к/Python/LIBS

, а затем скомпилированные проект для создания _MyClass.pyd.

В моем сценарии Python, это так же просто, как:

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

Это все. SWIG выполняет всю работу по обработке ссылки, возвращаемой getInstance().

Смежные вопросы