2011-06-07 14 views
22

Así que estoy desarrollando un proyecto python bastante grande con varios módulos. El módulo "principal" (ejecutable) es un daemon (un daemon de Thrift, en realidad) que llama a otros módulos para su funcionalidad real. Iniciar el daemon lleva mucho tiempo porque algunos de los módulos tienen procesos de inicialización bastante largos y complicados.Detecta si un módulo python cambia y vuelve a cargar

Así que cuando enciendo el daemon, espero ... digamos ... 2 minutos para que todo se cargue, lo cual no está nada mal en el gran esquema de cosas. Sin embargo, para el desarrollo se convierte en un gran dolor porque tengo que reiniciar el daemon CADA VEZ que ha estado perdiendo mucho tiempo.

La carga de la mayoría de los módulos solo demora unos segundos. Idealmente, lo que me gustaría hacer es detectar cuándo ha cambiado alguno de los archivos en un módulo en particular y volver a cargar ese módulo en particular. Ya he averiguado how to reload a module, pero en este momento no puedo entender cómo ver un módulo en particular para ver los cambios. Tenga en cuenta que un módulo no es un solo archivo .py en este caso, sino más bien un directorio con los archivos __init__.py y 5-10 .py, por lo que necesito detectar cuando cualquiera de ellos ha cambiado.

Este es el diagrama del proyecto (si hace alguna diferencia en absoluto)

project 
| -- daemonize.py 
| -- main.py 
| -- moduleA 
| | -- __init__.py 
| | -- happy_panda.py 
| ` -- sad_panda.py 
| -- moduleB 
| | -- __init__.py 
| | -- takes_forever_to_load.py 
| ` -- seriously_get_some_coffee.py 
| -- moduleC 
| | -- __init__.py 
| | -- frequently_changes.py 
| | -- reasons_i_hate_my_job.txt 
| ` -- home_address_of_moduleB_developer.txt 
` -- service.py <-- uses modules A, B, and C 

Cualquier idea o sugerencias son apreciadas.

EDITAR

Gracias por los comentarios. Aquí está el código que creé basado en las sugerencias. Hay un pequeño error donde pyinotify parece estar recibiendo más de una notificación, pero es un problema muy pequeño para mí, así que no voy a solucionarlo.

https://gist.github.com/1013122

+0

¿No vuelve a cargar ya comprobar que el archivo ha cambiado antes de hacer algo? –

+0

@ Bastien: Después de mirar la documentación para volver a cargar, no, no creo que así sea como se comporta la recarga. Corrígeme si estoy equivocado. –

Respuesta

8

Detect File Change Without Polling

junto con usted ya saber cómo volver a su módulo de esta respuesta se llena más o menos hacia fuera. Utiliza Inotify para "notificar" (ver lo que hicieron allí) el programa cuando se modifica el archivo.

+0

¡Muy bonito! Estaba pensando en tratar de averiguar si un módulo cambió justo antes de llamarlo; sin embargo, al hacerlo de esta manera, puedo volver a cargar el momento en que cambia el archivo. No hubiera pensado en eso. –

+0

Me alegro de ayudar, y me alegro de haber encontrado su pregunta en realidad, esto será útil en el futuro para algo en lo que estoy trabajando y no había considerado esta técnica como un ahorro de tiempo antes. – Paystey

1

me gustaría ver todos los archivos y detect if a file was modified. Si fuera así, lo haría reload.

+0

¿Cómo manejarías la determinación de qué archivos pertenecen a un módulo? Desde el nivel superior, todo lo que tengo es el nombre del módulo. –

+0

Me gustaría buscar en la carpeta de forma recursiva. ¿Hay archivos que cambian a menudo que no son archivos de código o de configuración? –

+0

Además, ¿qué haces en el inicio que toma 2 minutos? –

Cuestiones relacionadas