Estoy trabajando en la incrustación de Python en nuestra aplicación de suite de pruebas. El objetivo es utilizar Python para ejecutar varios scripts de prueba para recopilar datos y realizar un informe de pruebas. Varios scripts de prueba para una ejecución de prueba pueden crear variables globales y funciones que se pueden usar en el siguiente script.¿Cómo reiniciar un intérprete de Python incorporado?
La aplicación también proporciona módulos de extensión que se importan en el intérprete incorporado y se utilizan para intercambiar algunos datos con la aplicación.
Pero el usuario también puede realizar varias ejecuciones de prueba. No quiero compartir esos datos globales, las importaciones y los datos intercambiados entre varias pruebas. Debo asegurarme de reiniciar en un estado genuino para controlar el entorno de prueba y obtener los mismos resultados.
¿Cómo debo reiniciar el intérprete?
Utilicé Py_Initialize() y Py_Finalize(), pero obtengo una excepción en la segunda ejecución al inicializar por segunda vez los módulos de extensión que proporciono al intérprete. Y la documentación warns against using it more than once.
El uso de sub-interpreters parece tener las mismas advertencias con la inicialización de los módulos de extensión.
Sospecho que estoy haciendo algo mal con la inicialización de mis módulos de extensión, pero me temo que el mismo problema ocurre con los módulos de extensión de terceros.
Tal vez sea posible hacerlo funcionar al iniciar el intérprete en su propio proceso, para asegurarse de que se libera toda la memoria.
Por cierto, estoy usando boost-python para eso, que también advierte EN CONTRA de usar Py_Finalize!
¿Alguna sugerencia?
Gracias
Entonces, básicamente, debo instanciar una vez mi intérprete de Python, y usar este intérprete para iniciar subinterpretadores, ¿todos tienen su propio espacio de nombres? Parece una solución viable, si estos subinterpretadores no sufren las mismas advertencias que las hechas con Py_NewInterpreter. Voy a analizar detalladamente eso y experimentar con él. ¡Gracias! – nab
Lo tienes. Instanciar un InteractiveInterpreter le proporciona un entorno nuevo en todo momento. No estoy seguro de cuáles son las reglas con respecto a lo que hereda del intérprete padre, pero eso debería ser fácil de controlar de cualquier manera. –
Parece que está haciendo lo que quiero. Tenga en cuenta que tiene el mismo inconveniente para la inicialización de los módulos (solo se inicializan una vez). Pero funciona bien para limpiar el espacio de nombres. ¡Gracias! – nab