2011-02-11 9 views
5

Contexto:Empotrado de Python en C++ aplicación

un problema continuo que hemos estado enfrentando es la unidad a prueba nuestras aplicaciones de datos de mercado. Estas aplicaciones se sientan y observan los datos que se recuperan de las fuentes y hacen algo. Algunos eventos críticos que son difíciles de desencadenar rara vez ocurren y es difícil para los probadores verificar que nuestras aplicaciones funcionen correctamente en todas las situaciones, por lo tanto, debemos confiar en las pruebas unitarias.

Estos sistemas generalmente funcionan emitiendo devoluciones de llamadas (en nuestra aplicación) cuando ha ocurrido un evento, entonces nuestra tarea es lidiar con esto.

solución I imaginar:

¿Es posible incrustar Python, o extender (no 100% claro en esto), para que un probador podría encender un REPL Python y función tema llamadas que son similares a devoluciones de llamada que luego son manejadas por nuestras clases de C++. Alguna forma de manipulación dinámica de nuestros objetos en tiempo de ejecución.

Respuesta

7

Hago algo similar a esto en uno de mis proyectos utilizando SWIG para generar enlaces python para las partes relevantes del código C++. Luego inserto el intérprete como otros lo han sugerido. Una vez hecho esto, puedo ejecutar el código python a voluntad (por ejemplo, PyRun_SimpleString), que puede acceder al código C++. Normalmente termino usando algo así como un Singleton para facilitar el acceso a objetos específicos de C++ desde Python.

También vale la pena mencionar es directors en los módulos Swig Python, que permiten que las funciones virtuales se manejen de forma mucho más intuitiva. Dependiendo de lo que estés haciendo, es posible que encuentres estos muy útiles.

4

Lo que quiere hacer es posible, aunque no trivial, para hacerlo bien. Parece que quieres incrustar (en lugar de ampliar) Python. Ambos temas están cubiertos en el tutorial here.

Hay mucho trabajo en el mapeo de clases en C++ a clases de Python, y hay una serie de cosas que pueden salir mal de manera sutil, particularmente con fugas de memoria y multihilo (si su código actual es de subprocesos múltiples) . Sin embargo, si solo es para usar en una situación de prueba y la estabilidad no es crítica, entonces podría ser un problema menor.