C++ feat. Python Conecta, Incrusta, Instala con Facilidad

C++ con Python Conecta, Incrusta e Instala fácilmente

Aplicación empresarial de C++ para Windows que ejecuta un módulo de Python. Aquí está mi recorrido a través del proceso de esta fusión tecnológica, desde la primera línea de código hasta la entrega de la aplicación.

Imagen generada por el autor usando herramientas de IA

Introducción

La simplicidad de Python, su extenso ecosistema de paquetes y su comunidad de apoyo lo convierten en una elección atractiva. Por otro lado, al enfrentar interfaces de usuario complejas, flujos de datos multiproceso y robustez las 24 horas en soluciones empresariales, C++ toma el protagonismo. A veces, surge la necesidad de amalgamar estos dos, esforzándose por tener lo mejor de ambos mundos.

Frecuentemente, el código de Python invoca métodos de C++ para cálculos algorítmicos intrincados. Sin embargo, me encontré con un escenario opuesto donde mi aplicación de Aprendizaje Automático requería urgentemente invocar un modelo personalizado con código de inferencia basado en Python. La perspectiva de reescribirlo en C++ o adoptar un motor de inferencia correspondiente era inviable. Mi pensamiento inicial fue simple: “Llamar a Python desde C++ debería ser pan comido”. ¡Lamentablemente, subestimé la complejidad involucrada!

Expectativas vs. Realidad

Existen varios puentes fácilmente buscables que facilitan la interacción entre C++ y Python:

  1. La interfaz C++ integrada en Python accesible a través de los encabezados y bibliotecas de C++ (Python.h, Python.lib) incluidos en el paquete estándar de Python.
  2. Boost.Python, para aquellos que se sienten cómodos con la biblioteca Boost.
  3. Pybind11, mi preferencia por su combinación de potencia y facilidad de integración en proyectos.

A primera vista, la solución parece estar al alcance, y lo único que queda es seleccionar el puente más adecuado de este trío. ¡Pero veamos más de cerca!

Los métodos mencionados anteriormente destacan en su propósito principal de permitir la comunicación entre Python y C++, suficiente para pruebas y experimentos preliminares. Sin embargo, cuando se busca construir una solución entregable, debemos pensar en todo el ciclo de vida del software. Y uno de los desafíos a resolver es la distribución. Para aclarar, la tarea consiste en distribuir los binarios de C++ junto con los componentes de Python. Incluso compartir el código de Python en sí puede ser difícil, si se tiene en cuenta la instalación del intérprete en el sistema operativo. Además, pueden coexistir múltiples versiones de Python y cada paquete adicional requiere una instalación adecuada, incluida la resolución de dependencias. La pregunta entonces es: ¿qué opciones son viables para nuestro caso?

  1. Instruir a los usuarios que instalen Python y los paquetes necesarios antes de utilizar la aplicación de C++.
  2. Incorporar el instalador de Python dentro del instalador de C++ para abordar automáticamente los problemas relacionados, incluyendo otras instalaciones de Python en el sistema del usuario.

Ninguna de las opciones parece óptima. En consecuencia, me embarqué en una búsqueda para descubrir un enfoque más confiable y estable, que estoy ansioso por compartir contigo.

Python Integrado

¿Durante tu última visita a la página de inicio de Python, exploraste sus opciones de distribución? Entre ellas se encuentra una opción interesante: el paquete integrable de Windows. Esta opción despertó mi curiosidad, presentando una solución aparentemente mágica al problema de la distribución. Al adentrarme en la documentación oficial, descubrí detalles sobre esta versión integrada: sorprendentemente, Python ofrece una versión integrada para una integración sin problemas en otras aplicaciones.

Al examinar el contenido del archivo de la versión integrada, surgen un par de preguntas: ¿Cómo se pueden agregar módulos adicionales a esta configuración? ¿Y cómo se puede dirigir la aplicación de C++ para utilizar esta variante integrada?

Responder la primera pregunta es relativamente sencillo: los paquetes simplemente se pueden copiar de una instalación estándar de Python.

La segunda pregunta requirió una investigación exhaustiva, como se mencionó anteriormente, los puentes de Python funcionan con la instalación predeterminada. Si bien cambiar las variables de entorno de Python (PYTHONPATH, PYTHONHOME) puede ser ocasionalmente útil, no es una solución definitiva para cambiar a la configuración integrada, ya que Python puede colocar sus archivos en diferentes ubicaciones del sistema operativo.

Indicadores de Python para C++

El programa más simple de Python puede contener solo una línea:

print(‘¡Hola, mundo!’)

Python protege a los programadores de numerosas rutinas internas para lograr esta aparente simplicidad. Al lanzar esta línea silenciosamente, el intérprete maneja los parámetros de instalación, la inicialización, las importaciones de módulos por defecto, la compilación de bytecode, la búsqueda de funciones y más. Sin embargo, hay una forma de intervenir en estos mecanismos secretos. Citando la documentación oficial: “Python tiene variables para la configuración global para controlar diferentes características y opciones”. Estas existen como argumentos de línea de comandos o como indicadores y métodos para código C++, accesibles a través de Python.h ya mencionado. En el caso presente, necesitamos anular la ruta de búsqueda de Python utilizando el método Py_SetPath(). Otros indicadores entran en juego en algunos casos inusuales: Py_NoSiteFlag, Py_NoUserSiteDirectory, Py_IgnoreEnvironmentFlag. Estos indicadores se refieren a omitir la carga del módulo predeterminado del sitio, o ignorar un directorio separado con módulos en el directorio de inicio del usuario. ¡Revísalos para manejar casos específicos!

Guía de Resumen

  1. Prepara tu proyecto de C++ para comenzar a integrar Python.
  2. Decide la versión de Python e instálala en Windows como la instalación predeterminada.
  3. Descarga la misma versión de Python como un paquete incrustado y extráelo en el directorio de tu proyecto.
  4. Escribe código de prueba en Python que llame a todos los métodos de Python requeridos que necesita para copiar y probar módulos adicionales.
  5. Ejecuta el código de prueba de Python con la instalación incrustada (usa indicadores de línea de comandos para anular la ruta de búsqueda). Obtendrás errores de módulos faltantes si se utilizan algunos módulos no predeterminados. Copia uno a uno los módulos faltantes de la instalación predeterminada a la instalación incrustada para que el código de prueba de Python se ejecute correctamente.
  6. Ve a tu proyecto de C++. Obtén pybind11. Agrega proyectos que incluyan una ruta de búsqueda para él.
  7. Agrega rutas de búsqueda a los encabezados y bibliotecas de la instalación predeterminada de Python a tu proyecto.
  8. En el código de C++ usa Py_SetPath() para establecer la ruta relativa a la instalación incrustada de Python. Usa indicadores adicionales si es necesario.
  9. Si uno de los paquetes de Python se encuentra en el directorio de paquetes de usuario, simplemente cópialo a la carpeta de paquetes incrustados y agrega una ruta separada en Py_SetPath().
  10. En el código de C++, usa la API de pybind11 para acceder a los métodos de Python. Si el programa de C++ se congela al llamar al método de Python, entonces probablemente algún módulo de Python no se puede importar, usa el código de prueba de Python del paso [5] para solucionarlo.
  11. Distribuye los binarios de C++ con la carpeta incrustada de Python como un componente integral. Es posible que también debas copiar algunas DLL en la ubicación de tus binarios, como python3.dll y redistribuibles de Windows.

Parte Final

Las aplicaciones de C++ para uso en producción pueden incluir Python incrustado como parte de ellas de tal manera que los usuarios ni siquiera lo sepan. ¡Y eso es un gran logro, ya que a todos nos gusta llevar a cabo nuestras tareas con la ayuda de aplicaciones simples pero poderosas en lugar de rompernos la cabeza con su instalación!

Estoy compartiendo mi proyecto de demostración, que incorpora todos los conocimientos del artículo para tu inicio rápido.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Conoce a MetaGPT El asistente de IA impulsado por ChatGPT que convierte texto en aplicaciones web.

¡Esta revolucionaria herramienta de IA te permite crear aplicaciones web sin código en solo segundos!

Inteligencia Artificial

Conoce a RAVEN un modelo de lenguaje codificador-decodificador con mejora en la recuperación que aborda las limitaciones de ATLAS.

Los grandes modelos de lenguaje (LLMs) han desempeñado un papel importante en los últimos avances en el campo del Pro...

Inteligencia Artificial

Conoce CodeGPT Una nueva herramienta de generación de código que está causando sensación en la comunidad de IA

Nuevo entre las herramientas de generación de código de IA, CodeGPT se está convirtiendo rápidamente en favorito entr...

Inteligencia Artificial

Generación rápida y precisa de hologramas acústicos utilizando un marco basado en aprendizaje profundo

El equipo liderado por el profesor Hwang Jae-Yoon del Departamento de Ingeniería Eléctrica y Ciencias de la Computaci...

Inteligencia Artificial

Los robots de IA podrían desempeñar un papel futuro como compañeros en hogares de cuidado

Los robots sociales impulsados por inteligencia artificial podrían ayudar a cuidar a los enfermos y ancianos en el fu...

Inteligencia Artificial

La retroalimentación colaborativa ayuda a entrenar a los robots

Un enfoque de aprendizaje por refuerzo entrena a los robots utilizando retroalimentación proporcionada por usuarios n...