¿Cómo puede Python llamar a los objetos de C++ cuando el intérprete es C y ha sido creado con un compilador de C?¿Cómo funciona Boost.Python?
Respuesta
C++ puede interoperar con C mediante declaraciones externas "C".
Boost.Python tiene macros especiales que declaran funciones con extern "C"
para que el intérprete de Python pueda llamarlas. Es un poco complicado, pero puedes mirar el Boost documentation para obtener más información.
Python declara una C-API (ver http://docs.python.org/2/c-api/ o http://docs.python.org/3/c-api/). Esta API define un tipo de objeto genérico llamado PyObject
que es simplemente una estructura C normal. Esta estructura define (casi) todo lo que un objeto python puede hacer, por ejemplo, lo que sucede cuando se hacen adiciones o comparaciones en este objeto o simplemente lo llaman como una función.
Como los tipos de python también son objetos (y por lo tanto están representados en C por una estructura PyObject
), definir un nuevo tipo es una cuestión simple de definir una nueva estructura PyObject
como esa. Cuando se llaman a los métodos en Python, el intérprete reenvía la llamada a las funciones C asociadas con esta estructura.
Siempre y cuando una extensión determinada (compilada) proporcione los puntos de entrada correctos para que el intérprete de Python pueda introspeccionarla y averiguar qué está disponible (la documentación que indiqué anteriormente explica esto en detalle), puede usar estos objetos como cualquier otro objeto que normalmente tiene disponible en el prompt - que por cierto, se construyen usando la misma C-API. Le basta import
la extensión compilada.
Espero que esté algo claro cómo el intérprete de Python llama cosas desde extensiones compiladas de las anteriores. El único vacío que falta es cómo la C-API llama al código C++.
Boost.Python lo hace al declarar C puntos de entrada en el código a lo largo de las líneas como se explica aquí: Elegantly call C++ from C. Cada vez que llamas, por ejemplo, boost::python::class_
, hace esto para el tipo que declaras a python, creando así un PyObject
que representa tu clase, con el nombre que elijas. Cuando llame al .def
en esta clase, vaya rellenando los espacios internos de esa estructura, declarando más métodos, operadores y atributos de su nuevo tipo. Cada uno de estos espacios internos apunta a una función de estilo C que no es más que un contenedor para la llamada C++ equivalente.
- 1. Boost.Python - ¿Cómo devolver por referencia?
- 2. Ninguno en Boost.Python
- 3. Verdadero multithreading con boost.python
- 4. C++ Boost.Python: 2 problemas
- 5. cómo extraer una cadena Unicode con Boost.Python
- 6. Boost.Python clase de excepción personalizada
- 7. Cómo funciona la importación con Boost.Python desde dentro de los archivos de python
- 8. ¿boost.python no admite el paralelismo?
- 9. Boost.Python y C++ std :: vector de punteros
- 10. La exposición de un puntero en Boost.Python
- 11. Cómo pasar un puntero sin formato a Boost.Python?
- 12. Decapado de una enumeración expuesta por Boost.Python
- 13. Boost.Python: Devolución de llamada a funciones de clase
- 14. Pasar la lista de Python al vector C++ usando Boost.python
- 15. Configuración de metaclass de la clase envuelta con Boost.Python
- 16. Boost.Python: Definir un constructor fuera de una clase
- 17. Python en C++ utilizando la función de conversión Boost.Python
- 18. Boost.Python y CMake Enlace y la carga Errores
- 19. ¿Cómo funciona este "retraso" funciona
- 20. ¿Cómo funciona Arrays.asList (...). Contiene (...) funciona?
- 21. ¿Cómo funciona OfType <T>() ¿Funciona?
- 22. ¿cómo funciona {} mientras (0) funciona en macro?
- 23. ¿Cómo funciona `if (Test-Path ...)` realmente funciona?
- 24. ¿Cómo funciona exactamente si ($ variable) funciona?
- 25. ¿Qué hay de malo en las transmisiones de C++ cuando se utiliza boost.python?
- 26. Boost.Python llamada por referencia: TypeError: No to_python (by-value) converter found for C++ type:
- 27. Scrapy BaseSpider: ¿Cómo funciona?
- 28. ¿Cómo funciona Drupal?
- 29. ¿Cómo funciona cellForRowAtIndexPath?
- 30. ¿Cómo funciona printf?