gráfico en barras en tiempo real

Arnau Sanchez arnau en ehas.org
Mie Sep 26 22:02:59 CEST 2007


Maria Eugenia Ferrero escribió:

> Qué es exactamente lo que hace: dato.split()[0].strip('k') for dato in
> temp.split(':')[1].split(',')] ???
> Perdón mi ignorancia pero probando eso tampoco me sale entonces quiero saber
> mas o menos que es lo que estoy intetando hacer para ir probando
> modificándole algo.....
> Me da impotencia saber que es algo tan sencillo y que no me sale...!!!!!!

Tampoco creo que sea un problema tan trivial. Pero si tienes 
dificultades con las comprensiones de listas, es señal de que hace poco 
que estás con Python o que aún te falta algo de soltura...

En este caso, por ejemplo, para hacerlo de forma más o menos compacta, 
podrías usar el módulo subprocess, expresiones regulares (módulo re) y 
generadores; en un primera aproximación puede no ser evidente.

Cualquier solución que implique llamar una y otra vez a top no es 
aceptable. Hay que lanzarlo una única vez e ir leyendo datos sin esperar 
a que acabe (para eso se usa un objeto Popen del módulo subprocess). 
Antes preguntabas acerca de un parámetro del comando top, pero no tienes 
más que repasar su página de manual ("man top" en la shell)

Te paso una posible implementación en la cual se extraen, a modo de 
ejemplo, tres campos (los indicados en "fields"); te resultará sencillo 
ampliarlo e integrarlo en tu programa. La forma de extraer los campos no 
es especialmente eficiente, pero de este modo la función es más sencilla 
de abstraer:

#!/usr/bin/python
import subprocess
import re

def process(command):
     return subprocess.Popen(command, stdout=subprocess.PIPE)

def top(delay):
     command = ["top", "-b", "-d", str(delay)]
     return process(command)

def get_fields(datainput, fields):
     for line in datainput:
         for field, regexp in fields:
             match = re.search(regexp, line)
             if match:
                 yield field, int(match.groups()[0])

top_fields = [("total_memory", "^Mem:.*\s(\d+)k\s*total"),
     ("free_memory", "^Mem:.*\s(\d+)k\s*free"),
     ("free_swap", "^Swap:.*\s(\d+)k\s*free")]

popen = top(delay=1.0)
for field, value in get_fields(popen.stdout, top_fields):
     print field, value # hacer algo con field y value

Si tienes dificultades con algo de lo que hace, repasa el tutorial y la 
documentación de las librerías. O en caso de problemas insalvables, 
vuelve a la lista :-)

arnau




Más información sobre la lista de distribución Python-es