Tengo un servidor Python de ejecución prolongada y me gustaría poder actualizar un servicio sin reiniciar el servidor. ¿Cuál es la mejor manera de hacer esto?
if foo.py has changed:
unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()Puede recargar un módulo cuando ya ha sido importado usando importlib.reload():
from importlib import reload # Python 3.4+
import foo
while True:
# Do some things.
if is_changed(foo):
foo = reload(foo)
En Python 2, reloadera un incorporado. En Python 3, se movió al impmódulo. En 3.4, impquedó en desuso en favor de importlib. Cuando apunte a 3 o posterior, haga referencia al módulo apropiado al llamar reloado impórtelo.
Creo que esto es lo que quieres. Los servidores web como el servidor de desarrollo de Django usan esto para que pueda ver los efectos de los cambios en su código sin reiniciar el proceso del servidor.
Para citar de los documentos:
El código del módulo de Python se vuelve a compilar y el código de nivel de módulo se vuelve a ejecutar, definiendo un nuevo conjunto de objetos que están vinculados a los nombres en el diccionario del módulo mediante la reutilización del cargador que cargó originalmente el módulo. La
initfunción de los módulos de extensión no se llama por segunda vez.Al igual que con todos los demás objetos en Python, los objetos antiguos solo se recuperan después de que sus recuentos de referencia caen a cero.
Los nombres en el espacio de nombres del módulo se actualizan para apuntar a cualquier objeto nuevo o modificado.
Otras referencias a los objetos antiguos (como los nombres externos al módulo) no se vuelven a vincular para hacer referencia a los objetos nuevos y deben actualizarse en cada espacio de nombres donde aparecen, si así se desea.
Como anotó en su pregunta, tendrá que reconstruir Fooobjetos si la Fooclase reside en el foomódulo.