lanzar proceso externo pero que devuelva una variable
Claudio A. Quezada R.
claudio.quezada.r en gmail.com
Mie Ago 29 17:33:19 CEST 2007
Hola Arnau, gracias por los comentarios. Obviamente cualquier critica
constructiva se agradece. Respecto al thread, me parece que es lo
mejor en este caso, pues debo hacer 2 cosas: 1) Conectarme a la
balanza llamando al metodo leerBalanza() y 2) Actualizar el visor lcd,
ambos procesos sin dejar "pegado" el dialogo desde el que los llamo...
Te agradezco las sugerencias a mi código, probaré lo que me indicas
(aunque agregaré los except precisos del modulo uspp [timeout,
unabletoopen y otros mas]). Encontre unas cosas sobre threading, vere
como me va y luego contesto si ando muy perdido.
Saludos,
El 28/08/07, Arnau Sanchez <arnau en ehas.org> escribió:
> Claudio A. Quezada R. escribió:
>
> > Entonces, mi consulta es como podria lanzar un proceso externo que se
> > conecte a la balanza y que retorne la informacion leida como un string
> > o un float, o algo por el estilo... Seria lanzar un modulo balanza.py
> > donde este el metodo leerBalanza() a través de spawnv(), ¿pero como
> > puedo recuperar una variable de ese nuevo proceso?
>
> En este caso usaría un thread, aunque puede no ser sencillo si no has
> trabajado antes con ellos. No conozco PyQT, así que no sé darte más
> detalles, pero seguro que hay una forma de ejecutar tareas en segundo
> plano con threads.
>
> Si no te molesta, algún comentario del código:
>
> > def leerBalanza(port, timeout, baudrate):
> > try:
>
> Poner tanto código bajo un try/except es poco recomendable, mucho más si
> la captura de excepciones es indiscriminada; errores de cualquier tipo
> (incluidos los de tu código) quedarían enmascarados. Debes captura los
> errores especificos, en este caso los de lectura del puerto serial.
>
> > tty = SerialPort(port, timeout, baudrate)
> > lectura = []
> > bandera = True
> > while bandera:
>
> La forma idiomática en python es:
>
> while 1:
> if condicion_de_fin:
> break
>
> > caracter = tty.read()
> > if caracter != '\r' and caracter != '\n':
>
> if caracter not in '\r\n'
>
> > lectura.append(caracter)
> > if caracter == '\r' or caracter == '\n':
>
> Por ley de Morgan esto es la negación de la otra condición, por tanto es
> suficiente con "else:"
>
> > bandera = False
> > del tty
> > lectura = ''.join(lectura)
> > if len(lectura) >= 16:
> > peso = float(lectura[-11:-4])
> > unidad = str(lectura[-1])
> > LCD = str(self.peso) + ' ' + self.unidad
>
> ¿de dónde sale el self? en la definición de la función no aparece como
> primer parámetro, y por tanto no puede ser el método de una clase.
>
> > return LCD
> > else: leerBalanza(port, timeout, baudrate)
>
> Esta llamada recursiva quedaría muy bien en Erlang (si le añadieras un
> return), pero Python es poco amigo de estas cosas. Deberías poner un
> bucle externo, y si la longitud de la lectura no es la buena, volver a
> ejecutar el bucle sin llamar de nuevo a la función.
>
> Obviando el tema de las excepciones, y usando funciones anidadas, una
> posibilidad sería:
>
> def leerBalanza(port, timeout, baudrate):
> def leer():
> tty = SerialPort(port, timeout, baudrate)
> def leerc():
> while 1:
> caracter = tty.read()
> if caracter in '\r\n':
> break
> yield caracter
> lectura = ''.join(leerc())
> if len(lectura) < 16:
> return
> peso = float(lectura[-11:-4])
> unidad = str(lectura[-1])
> return "%s %s"%(str(self.peso), self.unidad)
>
> while 1:
> val = leer()
> if val is not None:
> return val
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
>
--
Claudio Quezada Romegialli
Ingeniero Ambiental
(02)7321665 - 81466049
Más información sobre la lista de distribución Python-es