Python - Uso de la funcion Sleep y otras dudas

   
Vista:
Imágen de perfil de Javier

Uso de la funcion Sleep y otras dudas

Publicado por Javier (9 intervenciones) el 09/12/2014 12:37:44
Hola, me ha surgido una duda a la hora de realizar un script para python.
El objetivo del script es que lea de un puerto un valor cada X tiempo (uso de la función sleep) y lo ponga en pantalla.
En principio parece una tarea muy sencilla, pero no se como usar correctamente la funcion sleep.
Entonces he empezado por crear un programa alternativo que simplemente pregunte la frecuencia de lectura del valor y la imprima (la frecuencia, no el valor).
Para ello he creado este codigo, pero me falta saber como asegurarme que la frecuencia que lea sea un numero entero comprendido entre el 0.1 y el 2, por ejemplo:
1
2
3
4
def datos():
often= input("How often do you want to print the result? (In seconds) Please, enter a value between 0.1 and 2.")
while not (str.isdigit(often) and (often>=0.1)and(often<=2)):
often=input("How often do you want to print the result? (In seconds) Please, enter a value between 0.1 and 2.")
Al ejecutar este codigo, me da un error porque considera a "often" como float en vez de str (o al reves):
1
2
3
4
5
6
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
datos()
File "<pyshell#1>", line 4, in datos
while not (str.isdigit(often) and (often>=0.1)and(often<=2)):
TypeError: unorderable types: str() >= float()

Alguna idea con ésto?

La otra duda, es la implementación de la funcion sleep, que sería algo así:
1
2
3
4
veces=0
    while veces<100:
        time.sleep (often) #esta es la función que no se utilizar
        veces=veces+1

Muchas gracias por vuestra ayuda amigos.
Un saludo, Javier
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Javier

Uso de la funcion Sleep y otras dudas

Publicado por Javier (9 intervenciones) el 09/12/2014 17:48:35
Bueno, he ido probando y he solucionado el error poniendo un float, no es perfecto, porque si pones cualquier cosa que no sea un numero, tira error y se cierra, pero como es para uso propio, no pasa nada, se lo que hay que poner (es solo por adornarlo un poco más )

1
2
3
4
5
6
def datos():
 
import time
often= float(input("How often do you want to print the result? (In seconds) Please, enter a value between 0.1 and 2."))
while not ((often>=0.1)and(often<=2)):
often=float(input("How often do you want to print the result? (In seconds) Please, enter a value between 0.1 and 2."))

Ahora viene el problema del sleep, que sigo sin saber como va...
A ver, me explico, una vez leido el "often" se aplica a time.sleep(often) y eso implica que el programa se reinicie cada "often" tiempo? Porque yo quiero medir en "continuo" (bueno, realmente, en discontinuo pero a un tiempo diferencial) un valor y que me lo muestre en pantalla...
No se si me explico Habia pensado en poner un contador,"veces", para que tomase X medidas, en el ejemplo son 100, pero podrían ser 10-15-20...
Que os parece, así tiraría?

1
2
3
4
5
veces=0
while often<100:
print ("hola")
'''time.sleep (often) #esta es la función que no se utilizar'''
veces=veces+1
Muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Uso de la funcion Sleep y otras dudas - Python 2.7

Publicado por xve (1229 intervenciones) el 09/12/2014 19:02:26
Hola Javier, no se muy bien que error te da, pero el código esta bien, y no debería de fallarte... mira este ejemplo que te he preparado... funciona perfectamente en Python 2.7!!!

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import time
 
veces=0
while veces<100:
	x=time.time()
	time.sleep(veces)
	print "Han pasado %s segundos" % (time.time()-x)
	veces+=1

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Javier

Uso de la funcion Sleep y otras dudas

Publicado por Javier (9 intervenciones) el 09/12/2014 19:08:30
Hola, gracias por la respuesta! uso el python 3, asi que mal tema.
De todas maneras he investigado un poco, y en vez de usar el while, he metido un range, y así me funciona (al menos en mi pc windows, ya veremos en el oficial con su ubuntu y sus rarezas...)
De momento el codigo queda así:

1
2
3
4
5
6
7
8
9
def datos():
    import time
    often= float(input("How often do you want to print the result? (In seconds) Please, enter a value between 0.1 and 2."))
    while not ((often>=0.1)and(often<=2)):
        often=float(input("How often do you want to print the result? (In seconds) Please, enter a value between 0.1 and 2."))
    from time import sleep
    for i in range(10):
        print("hola")
        sleep(often)
Con esto consigo que imprima 10 (el atributo del range) veces la palabra "hola" con un intervalo de "often" segundos... perfecto!!

Muchas gracias!

Edito: en cuanto al error de poner una letra en vez de un numero como atributo de often:
30x97pj
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Uso de la funcion Sleep y otras dudas . Python 3

Publicado por xve (1229 intervenciones) el 09/12/2014 19:37:07
Aquí el mismo código para Python 3 por si alguien lo necesita:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import time
 
veces=0
while veces<100:
	x=time.time()
	time.sleep(veces)
	print ("Han pasado %s segundos" % (time.time()-x))
	veces+=1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Cristofer

Uso de la funcion Sleep y otras dudas

Publicado por Cristofer (34 intervenciones) el 10/12/2014 18:26:48
"Bueno, he ido probando y he solucionado el error poniendo un float, no es perfecto, porque si pones cualquier cosa que no sea un numero, tira error y se cierra"

Para evitar esto solo debes implementar una estructura while para controlar las excepciones que te envía Python

1
2
3
4
5
6
while True:
    try:
        <código a probar>
        break
    except:
        <en caso de una excepciona hace esto>

<código a probar> Escribe aquí la sentencia que puede producir una excepción (error) por ejemplo:

1
float(input("Ingrese un numero: ")

Si yo pusiera letras en vez de números en ese input me daría un error ya que las letras son de tipo string y pasarlos a float es un error lógico. Si una persona llegase a entrar letras en ese input se lanzaría entonces la excepción y se ejecutaría el bloque "except"

<en case de una excepción hace esto> Escribe aquí la sentencia que se llevara a acabo en caso de que ocurra una excepción.

podría ser por ejemplo...

1
2
3
print("Error: Ingrese solo dígitos")
sleep.time(3)
os.system("cls")  <---- Solo si estas en windows, en caso de estar en alguna distribución de linux cambia "cls" por "clear"

No olvides poner un break al final del bloque de try: ya que si no el while se ejecutara infinitamente.
puedes buscar mas información sobre el control de excepciones en google buscando algo como:

"Control de excepciones en Python"

sleep.time(n)

donde n son segundos que quieres que el programa "Duerma" antes de ejecutar lo que sigue del código...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar