Tengo un archivo de registro que está siendo escrito por otro proceso que quiero ver si hay cambios. Cada vez que se produce un cambio, me gustaría leer los nuevos datos para procesarlos.
¿Cuál es la mejor manera de hacer esto? Esperaba que hubiera algún tipo de gancho de la biblioteca PyWin32. He encontrado la win32file.FindNextChangeNotification
función pero no tengo idea de cómo pedirle que vea un archivo específico.
Si alguien ha hecho algo como esto, estaría muy agradecido de saber cómo ...
[Editar] Debería haber mencionado que estaba buscando una solución que no requiere sondeo.
[Editar] Maldiciones! Parece que esto no funciona en una unidad de red asignada. Supongo que Windows no "escucha" ninguna actualización del archivo como lo hace en un disco local.
strace
monitoreowrite
para estoRespuestas:
¿Ya ha mirado la documentación disponible en http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html ? Si solo necesita que funcione en Windows, el segundo ejemplo parece ser exactamente lo que desea (si intercambia la ruta del directorio con la del archivo que desea ver).
De lo contrario, el sondeo probablemente será la única opción realmente independiente de la plataforma.
Nota: no he probado ninguna de estas soluciones.
fuente
¿Intentaste usar Watchdog ?
fuente
easy_install
? Cheque. ¿Licencia gratuita? Compruebe . Resuelve el problema en las grandes plataformas? Compruebe . Respaldo esta respuesta. Solo tenga en cuenta: el ejemplo en su página de proyecto no funciona fuera de la caja. Utilice el de su github en su lugar.Si la encuesta es lo suficientemente buena para ti, solo miraría si cambia la estadística del archivo de "tiempo modificado". Para leerlo:
(Tenga en cuenta también que la solución de evento de cambio nativo de Windows no funciona en todas las circunstancias, por ejemplo, en unidades de red).
fuente
if self._cached_stamp is not None
.Si desea una solución multiplataforma, consulte QFileSystemWatcher . Aquí un código de ejemplo (no desinfectado):
fuente
watchdog
paquete es la respuesta correctaPySide
para eso en lugar dePyQt
un uso tan pequeño?No debería funcionar en Windows (¿tal vez con Cygwin?), Pero para usuarios de Unix, debe usar la llamada al sistema "fcntl". Aquí hay un ejemplo en Python. Es principalmente el mismo código si necesita escribirlo en C (los mismos nombres de función)
fuente
Echa un vistazo a pyinotify .
inotify reemplaza dnotify (de una respuesta anterior) en linuxes más nuevos y permite el monitoreo a nivel de archivo en lugar de a nivel de directorio.
fuente
Bueno, después de un poco de pirateo del guión de Tim Golden, tengo lo siguiente que parece funcionar bastante bien:
Probablemente podría funcionar con una carga más de comprobación de errores, pero para simplemente mirar un archivo de registro y realizar un procesamiento antes de escupirlo a la pantalla, esto funciona bien.
Gracias a todos por sus comentarios, ¡cosas geniales!
fuente
Para ver un solo archivo con sondeo y dependencias mínimas, aquí hay un ejemplo completamente desarrollado, basado en la respuesta de Deestan (arriba):
fuente
watch_file
y_cached_stamp
en listas, e iterar a través de ellos en un bucle. Sin embargocall_func_on_change()
se activará en la primera ejecución delook()
, pero luego_cached_stamp
se actualizará, por lo que no se activará nuevamente hasta que el valor de losos.stat(self.filename).st_mtime. _cached_stamp
cambios._cached_stamp
en el constructor si no deseacall_func_on_change()
ser llamado en la primera ejecuciónself.call_func_on_change(self) def custom_action(): watcher = Watcher(watch_file, custom_action())
Pero esto no funcionó. Solo se llamó a la acción durante la primera iteración: el archivo cambió sí, cambió El archivo cambió El archivo cambió El archivo cambió Comenzó a funcionar cuando mantuve * args y lo llamé:watcher = Watcher(watch_file, custom_action)
me cuesta preguntarme ¿por qué?Comprueba mi respuesta a una pregunta similar . Puedes probar el mismo bucle en Python. Esta página sugiere:
También vea la pregunta tail () un archivo con Python .
fuente
La solución más simple para mí es usar watchmedo, la herramienta de watchdog
Desde https://pypi.python.org/pypi/watchdog ahora tengo un proceso que busca los archivos sql en un directorio y los ejecuta si es necesario.
fuente
Bueno, como estás usando Python, puedes abrir un archivo y seguir leyendo líneas.
Si la lectura de línea no está vacía , la procesa.
Puede faltar que está bien seguir llamando
readline
al EOF. Seguirá devolviendo una cadena vacía en este caso. Y cuando se agrega algo al archivo de registro, la lectura continuará desde donde se detuvo, según lo necesite.Si está buscando una solución que use eventos o una biblioteca en particular, especifique esto en su pregunta. De lo contrario, creo que esta solución está bien.
fuente
Aquí hay una versión simplificada del código de Kender que parece hacer el mismo truco y no importa todo el archivo:
fuente
Esta es otra modificación del script de Tim Goldan que se ejecuta en tipos de Unix y agrega un simple observador para la modificación de archivos mediante el uso de un dict (file => time).
uso: whateverName.py path_to_dir_to_watch
fuente
Como puede ver en el artículo de Tim Golden , señalado por Horst Gutmann , WIN32 es relativamente complejo y observa directorios, no un solo archivo.
Me gustaría sugerirle que busque en IronPython , que es una implementación de Python .NET . Con IronPython puedes usar toda la funcionalidad .NET , incluyendo
Que maneja archivos individuales con una simple interfaz de eventos .
fuente
Este es un ejemplo de comprobación de cambios en un archivo. Una que puede no ser la mejor manera de hacerlo, pero seguramente es un camino corto.
Herramienta práctica para reiniciar la aplicación cuando se han realizado cambios en la fuente. Hice esto cuando jugaba con pygame para poder ver los efectos inmediatamente después de guardar el archivo.
Cuando se usa en pygame, asegúrese de que las cosas en el bucle 'while' se coloquen en su bucle de juego, también conocido como actualización o lo que sea. De lo contrario, su aplicación se atascará en un bucle infinito y no verá la actualización de su juego.
En caso de que quisieras el código de reinicio que encontré en la web. Aquí está. (No es relevante para la pregunta, aunque podría ser útil)
Diviértete haciendo que los electrones hagan lo que quieres que hagan.
fuente
.st_mtime
lugar de.st_size
sería más confiable y una forma igualmente corta de hacerlo, aunque el OP ha indicado que no quería hacerlo a través de encuestas.fuente
Aquí hay un ejemplo orientado a ver archivos de entrada que escriben no más de una línea por segundo, pero generalmente mucho menos. El objetivo es agregar la última línea (escritura más reciente) al archivo de salida especificado. Copié esto de uno de mis proyectos y eliminé todas las líneas irrelevantes. Tendrá que completar o cambiar los símbolos que faltan.
Por supuesto, la clase QMainWindow que abarca no es estrictamente necesaria, es decir. puede usar QFileSystemWatcher solo.
fuente
También puede usar una biblioteca simple llamada repyt , aquí hay un ejemplo:
fuente
Parece que nadie ha publicado fswatch . Es un observador de sistemas de archivos multiplataforma. Simplemente instálelo, ejecútelo y siga las instrucciones.
Lo he usado con programas de python y golang y simplemente funciona.
fuente
Solución @ 4Oh4 relacionada: un cambio suave para una lista de archivos para ver;
fuente
La mejor y más simple solución es usar pygtail: https://pypi.python.org/pypi/pygtail
fuente
No conozco ninguna función específica de Windows. Puede intentar obtener el hash MD5 del archivo cada segundo / minuto / hora (depende de qué tan rápido lo necesite) y compararlo con el último hash. Cuando difiere, sabe que el archivo ha cambiado y lee las líneas más recientes.
fuente
Intentaría algo como esto.
El bucle verifica si hay una nueva línea (s) desde la última vez que se leyó el archivo; si es así, se lee y se pasa a la
functionThatAnalisesTheLine
función. Si no, el script espera 1 segundo y vuelve a intentar el proceso.fuente