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