¿Hay alguna forma de borrar "todo" en el lado Python de JMP sin cerrar la sesión JMP (algo similar a Eliminar símbolos() en JSL o una forma de reiniciar el kernel)?
Estoy desarrollando una aplicación que utiliza la integración de JMP con Python con mi colega y, a medida que realizamos cambios en el código Python, debemos cerrar JMP constantemente. Hacemos esto para "limpiar" Python cuando nos encontramos con problemas en los que el código Python antiguo está en la memoria y las importaciones no sobrescriben el código ya importado.
Módulos actualizados que se ignoran. Muchas sorpresas y maravillas... hasta que te das cuenta...
¡Argh!
¿ del funciona?
import sys
print(sys.path)
del sys
print(sys.path)
Hay problemas . En la mayoría de los scripts de Python, el problema no se nota mucho porque el tiempo de vida de Python en sí suele ser el mismo que el del script. Comenzarías a notarlo si ejecutaras Python de forma interactiva durante una sesión larga, haciendo varias cosas dentro de la misma sesión interactiva. Esto se complica aún más porque algunos de los paquetes de Python se implementan en C/C++ (e incluso Fortran), como NumPy. Python los carga como bibliotecas compartidas y no hay una forma segura de descargar la biblioteca compartida de un proceso en ejecución, aparte de un reinicio. JMP está en una posición similar con la propia biblioteca compartida de Python, no se puede descargar. Sí, del funciona para liberar objetos. Sin embargo, del sys no está haciendo lo que podrías esperar. Esto no está eliminando o descargando el 'módulo' ni descargando dlls dependientes, simplemente está eliminando el objeto 'sys' que contiene las referencias al módulo cargado. El otro aspecto es que sys es un módulo integrado de Python, no lo mismo que un módulo cargado. Eliminar 'sys' no limpia ningún cambio que hayas podido realizar, por ejemplo agregar otra ruta a sys.path.
Si lo haces:
sys.path.append('/usr/local/bin')
print(sys.path)
del sys
print(sys.path). # gives error on sys
import sys
print(sys.path). # still contains the /usr/local/bin addition
Lo anterior se ejecutó en una sesión interactiva en una ventana de terminal. Solo al salir de Python y reiniciarlo se borró /usr/local/bin de sys.path. La única forma real es que usted lleve un registro de todas las variables utilizadas en una sesión y luego las elimine al final de la "sesión". Una forma sería colocar cada variable en una lista o diccionario y luego eliminar el contenedor al final de la sesión.
Estoy investigando el uso de subintérpretes de Python que podrían permitir configurar código que no se ejecuta en el entorno global. La idea es que el subintérprete sea independiente y que apagarlo actúe como apagar y reiniciar Python. En la actualidad, no he encontrado una forma segura de apagar y reiniciar el intérprete principal de Python durante la duración de una sesión JMP.
La práctica actual de Python para recargar un módulo (a partir de Python 3.4) es
<SPAN class="hljs-keyword">import</SPAN> importlib
importlib.reload(modulename)
Intentando recargar el sistema da
>>> importlib.reload(sys)
Al recargar numpy, se obtiene el siguiente resultado...
>>> importlib.reload(np)
/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/importlib/__init__.py:169: UserWarning: The NumPy module was reloaded (imported a second time). This can in some cases result in small but subtle issues and is discouraged.
_bootstrap._exec(spec, module)
Tenga en cuenta la advertencia para el usuario:
Advertencia de usuario: el módulo NumPy se volvió a cargar (se importó por segunda vez). En algunos casos, esto puede generar problemas pequeños pero sutiles y no se recomienda. _bootstrap._exec(spec, module)
Incluso la forma "oficial" de recargar un módulo puede causar problemas.
importlib.reload() funciona muy bien cuando se desarrolla un módulo Python en código, ya que los cambios en el código fuente de un módulo no se reflejarán hasta que se vuelva a cargar, lo que potencialmente obliga a volver a compilar en .pyc el código Python.