Создание экземпляра класса C ++ и вызов его методов в Python - PullRequest
6 голосов
/ 25 августа 2011

Я пытаюсь использовать библиотеку C ++ в своем приложении на python. Я могу загрузить dll в python, но не смог найти никакого решения о том, как создать экземпляр класса, который находится внутри этой c ++ dll, и вызвать методы для этого объекта.

Вот что я сделал и хочу

C ++ код внутри My.dll

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

Код Python

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

Я хочу сделать следующее

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

Ответы [ 2 ]

4 голосов
/ 25 августа 2011

Хотя это может возможно с ctypes, это, конечно, не будет так просто.Будет гораздо проще использовать, например, Boost.Python или Cython , чтобы создать правильное расширение CPython, которое отображает этот класс как тип Python.

2 голосов
/ 26 августа 2011

Загрузка C ++ dll с Ctypes опасна и имеет некоторые серьезные ограничения.Имя экспортируемой функции не совпадает с объявленным вами, если только вы не объявили функцию в C ++ как 'extern "C"'.Это возможно только для чистых функций, но не для функций-членов.Компилятор C ++ делает то, что называется «искажение имени», см. http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B.

Я предлагаю два решения:

  1. Вы пишете некоторый код C ++ с чистыми функциями, объявленными как 'extern' C«», который предоставляет необходимую вам функциональность.
  2. Я действительно рекомендую вам использовать Cython http://cython.org/,, особенно http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html.Я часто его использовал, и для меня это лучший способ обернуть код C ++ в Python.

ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ:

Я пытался несколько раз повысить Python, но мне было трудноиспользовать.У него есть своя собственная система сборки, которую вы должны изучить, процесс компиляции очень медленный, и из-за синтаксиса шаблона код становится трудным для чтения.Дело в том, что контекст Boost Python очень крутой, но, на мой взгляд, его трудно использовать.

Я также попробовал SIP и SWIG, что мне не очень понравилось.

Я очень рекомендую использовать Cython.

...