Puedes comprobar si hay algo para leer o escribir a un fichero (bien a un fichero Python o a un fichero de más bajo nivel del Sistema Operativo) y automáticamente invocar una función. Ésto es especialmente útil para aplicaciones de red. La función:
source_id = gobject.io_add_watch(source,condition,callback)
donde el primer argumento (source) es el fichero
abierto (objeto de fichero de Python o descriptor de fichero de más bajo nivel)
que quieres monitorizar. La función gobject.io_add_watch()
usa internamente el descriptor de fichero de bajo nivel, pero la función lo
podrá extraer usando el método fileno() cuando sea
necesario. El segundo argumento (condition)
especifica qué es lo que se quiere monitorizar. Puede ser cualquiera de:
gobject.IO_IN - Llama a tu función cuando en el fichero hay datos disponibles para leer.
gobject.IO_OUT - Llama a tu función cuando el fichero está listo para escritura.
gobject.IO_PRI - Llama a tu función cuando el fichero tiene datos urgentes para leer.
gobject.IO_ERR - Llama a tu función cuando se da una condición de error.
gobject.IO_HUP - Llama a tu función cuando se ha producido un "cuelgue" (se ha roto la conexión, de uso para pipes y sockets generalmente).
Estas constantes se definen en el módulo gobject module. Supongo
que ya te has dado cuenta que el tercer argumento,
callback, es la función que quieres que se llame cuando
las condiciones anteriores se cumplen.
El valor de retorno, source_id se puede
usar para parar de monitorizar el fichero usando la siguiente función:
gobject.source_remove(source_id)
Tu función será algo parecido a:
def input_callback(source, condition):
donde source y condition son
los que especificaste antes. El valor de source será el descriptor de fichero
de bajo nivel y no el objeto fichero Python (es decir, el valor que devuelve
el método de fichero de Python fileno()).
También se puede parar la monitorización devolviendo cero o FALSE (falso) desde tu función. Obviamente esto significa que si quieres que el monitorización se siga llamando, debes devolver un valor distinto de cero, como TRUE (verdadero).