2011-08-25 12 views
5

Estoy tratando de usar una biblioteca C++ en mi aplicación python. Puedo cargar el archivo dll en python, pero no pude encontrar ninguna solución sobre cómo crear una instancia de una clase que está dentro de ese C++ dll e invocar métodos en ese onject.Creación de una instancia de una clase C++ y métodos de llamada sobre ella en Python

que sigue es lo que hice y quiero

código C++ dentro My.dll

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

código Python

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

quiero hacer la siguiente

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

Deberías echarle un vistazo a Boost :: Python –

+0

Ni siquiera puedes hacer esto mezclando diferentes compiladores de C++, no importa un idioma diferente. [Escuche @CatPlusPlus y escriba una extensión completa de Python con tipos de Python.] (Http://stackoverflow.com/questions/7196118/creating-an-instance-of-ac-class-and-calling-methods-on -it-in-python/7196380 # 7196380) –

Respuesta

5

Si bien podría ser posible con los tipos, ciertamente no será tan sencillo como eso. Será mucho más fácil de usar, p. Boost.Python o Cython para crear una extensión CPython adecuada que expone esa clase como un tipo de Python.

1

Cargar un C++ dll con Ctypes es peligroso y tiene algunas limitaciones importantes. El nombre de la función exportada no es el mismo que usted declaró, a menos que haya declarado la función en C++ como 'extern' C "'. Esto solo es posible para funciones puras, no para funciones miembro. El compilador C++ hace algo llamado "name mangling", vea http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B.

que sugieren dos soluciones:

  1. Usted escribe algo de código C++ con funciones puras, declarados como 'extern 'C'', que exponen la funcionalidad que necesita.
  2. Realmente recomiendo usar Cython http://cython.org/, especialmente http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html debería ayudarlo. Lo usé mucho, y para mí es la mejor manera de ajustar el código C++ a Python.

NOTAS ADICIONALES:

me trataron impulso pitón algunas veces, pero encontraron difícil de usar. Tiene su propio sistema de compilación que debe aprender, el proceso de compilación es muy lento y, debido a la sintaxis de la plantilla, el código se vuelve difícil de leer. Es que el contexto detrás de boost python es genial, pero en mi opinión es difícil de usar.

También probé SIP y SWIG con los que no me sentía muy cómodo.

Realmente recomiendo usar Cython.

+0

¿Te refieres a "python" en la primera línea? Estoy confundido por qué dices cython es peligroso y limitado, luego lo recomiendo en (2). (No sé nada de esto ...) –

+0

lo arregló. ahora es ctypes. – rocksportrocker

Cuestiones relacionadas