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