[Python-es] Necesito ayuda con hilos o algún método para que no salga el mensaje: La aplicación no responde.

Alberto Curro bertothunder en gmail.com
Jue Mar 14 14:01:50 EDT 2019


Buenas,

  Deberías leerte de nuevo la respuesta del compañero Angel, porque te ha
dado casi la solución completa.

  No debes usar hilos con popen, tendrás errores. El propio módulo
subprocess, como te recomienda Angel, te dará la funcionalidad que
necesitas.

 Saludos


El sáb., 2 mar. 2019 a las 1:15, Héctor J. Benítez Corredera (<
facturasxebolax en gmail.com>) escribió:

> Hola gracias por tu respuesta. Bien e estado probando pero realmente mi
> problema es cuando se lanza popen ejecutando la aplicación externa.
>
>
>
> Bien en ese momento popen al ejecutar la aplicación bloquea la GUI dando
> el mensaje la aplicación no responde.
>
>
>
> Bien hasta que no termina de ejecutar la aplicación externa no vuelvo a
> tener control del GUI.
>
>
>
> Pretendo poner una ventana con el titulo Espere por favor y que se ejecute
> detrás de ella la aplicación, lo que quiero evitar es el mensaje de la
> aplicación no responde ya que puede dar a malentendidos y el usuario puede
> cerrarla, eso puede ser peligroso en la clase de aplicación que estoy
> haciendo ya que se trata de modificaciones a móviles Android y interrumpir
> la acción a lo bruto sin que termine puede ser perjudicial.
>
>
>
> Yo se que la aplicación esta funcionando y que si existe algún fallo esta
> controlado con la salida del returncode , pero un usuario el encontrarse el
> mensaje la aplicación no responde puede no querer esperar a su finalización
> y al ser alguna de las tareas que hace de varios minutos como mencione
> puede ser peligroso.
>
>
>
> Por eso lo de los Threads para ejecutar la aplicación sin que bloquee la
> ventana de espera.
>
>
>
> No se si me e explicado correctamente.
>
>
>
> No obstante sigo buscando.
>
>
>
> Agradecido de nuevo.
>
>
>
> Cordiales saludos
>
> El 01/03/2019 a las 11:24, Angel Lis escribió:
>
> Buenas Hector,
> creo, sin haber adentrado demasiado en tu codigo, que estas usando
> incorrectamente el Popen, ademas the un poco de confusion con el tema de
> Threads vs Processes.
>
> Supongo que tu objetivo es lanzar un proceso ( programa externo, con su
> heap propio, etc) y cada X tiempo "checkear" si  el programa ha acabado, ha
> fallado o cualquier cosa entre medio.
>
> Con Popen, el primer parametro es un array (o lista) de string, que
> definen en proceso y los parametros, asi que en tu caso seria algo asi como:
>
> comando1 = ["adb", "push" , f"{abrirzip}", " /sdcard/"]
>
> Y luego, para checkear el status podrias hacer algo como esto:
>
> In [3]: with
> subprocess.Popen(["/bin/bash","/tmp/blah.sh"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
> as myproc:
>     ...:     while True:
>     ...:         try:
>     ...:             res = myproc.wait(1) #wait for the process to end for
> 1 second
>     ...:             print(res) # if 0 ok, for any other value...
> mastercard ;)
>     ...:             print(myproc.stdout.read()) #show the output, or
> stderr if you want to show teh error
>     ...:             break
>     ...:         except subprocess.TimeoutExpired as e:
>     ...:             print("still running")
>     ...:             continue
>     ...:
>     ...:
> ahora mismo no puedo ofrecerte una respuesta mas extensa, pero si tienes
> cualqueir duda, pregunta que te respondere en cuando pueda.
>
>
> Un saludo.
>
>
>
>
> El vie., 1 mar. 2019 a las 10:01, Héctor J. Benítez Corredera (<
> facturasxebolax en gmail.com>) escribió:
>
>> Hola empezare diciendo que soy nuevo en Python y autodidacta por lo que
>> lo de buscar es lo único que hago.
>>
>>
>>
>> Bien me encuentro en un problema el cual no consigo encontrar solución ni
>> ningún ejemplo el cual me aclare el concepto o como usar el tema de los
>> hilos, creo que los hilos es la solución a mi problema.
>>
>>
>>
>> Bien paso a detallarlo, e programado una interface con wxpython y estoy
>> usando Python 3.7 DE 64 BITS, la cual tiene una consola que captura stdout
>> y stderr y da el resultado en esa consola. Los resultados vienen de la
>> interacción con la aplicación adb.exe la cual llamo através de popen.
>>
>> Bien todo funciona correctamente hasta que hago la llamada adb.exe
>> através de popen y como es copiar un archivo grande al móvil la interface
>> se cuelga hasta que no termina el proceso saliendo el mensaje la aplicación
>> no responde…
>>
>>
>>
>> Bien e leído mucho sobre los hilos y la verdad no tengo nada claro, e
>> mirado muchos ejemplos y e intentado integrarlos pero sin éxito en ninguno.
>>
>>
>>
>> Quiero algo sencillo que se ejecute popen, me deje capturar el stdout,
>> stderr y el returncode, decir que antes de lanzar popen lanzo una ventana
>> de Espere por favor… y deseo que no se pueda interactuar con la aplicación
>> hasta que no termine bien o mal el proceso de popen. Esto ultimo lo consigo
>> con la ventana de Espere por favor.
>>
>>
>>
>> Bien lo ultimo que creía que me podía funcionar es:
>>
>>
>> http://stackoverflow.com/questions/1191374/subprocess-with-timeout/4825933#4825933
>>
>>
>>
>> E visto mucho como capturar el stdout y stderr en tiempo real, e visto
>> como actualizar la consola conforme llegan los datos a dichos parámetros
>> pero nada de eso me interesa y los ejemplos son muy complicados para mi
>> nivel actual.
>>
>>
>>
>> Bien dejo parte del código el cual me tiene parado ya que no quiero
>> continuar hasta encontrarle una solución al problema de la aplicación no
>> responde.
>>
>>
>>
>> Comentar que estoy en Windows 10.
>>
>>
>>
>> ### Inicio código
>>
>>
>>
>>         wildcard = "Archivos flash (*.ZIP)|*.zip"
>>
>>
>>
>>         dlg = wx.FileDialog(
>>
>>             self, message="Seleccione un Archivo",
>>
>>             defaultDir=os.getcwd(),
>>
>>             defaultFile="",
>>
>>             wildcard=wildcard,
>>
>>             style=wx.FD_OPEN |
>>
>>                   wx.FD_CHANGE_DIR | wx.FD_FILE_MUST_EXIST |
>>
>>                   wx.FD_PREVIEW
>>
>>             )
>>
>>         if dlg.ShowModal() == wx.ID_OK:
>>
>>             paths = dlg.GetPaths()
>>
>>             for path in paths:
>>
>>                 global abrirzip
>>
>>                 abrirzip = path
>>
>>                 global archivoresultado
>>
>>                 archivoresultado = os.path.basename(abrirzip)
>>
>>             dlg.Destroy()
>>
>>             result = Result()
>>
>>             loadDlg = PopupDialog(None, "Espere por favor...",
>> "Ejecutando la acción, no cierre esta ventana y espere información...")
>>
>>             print(time.strftime("%H:%M:%S") + " *** Inicio de la copia
>> al Almacenamiento Interno de " + archivoresultado + " ***\n")
>>
>>
>>
>>             play_sound()
>>
>>
>>
>>             os.chdir(directorio + "/zbin")
>>
>> ### Esto es lo que me gustaría que no bloqueara el programa
>>
>> ### Que trabajara detrás de la ventana Espere por favor…
>>
>>             comando1 = "adb push " + abrirzip + " /sdcard/"
>>
>>             p = Popen(comando1, stdin=PIPE, stdout=PIPE, stderr=PIPE,
>> encoding='utf8', startupinfo=si)
>>
>>             (stdout, stderr) = p.communicate()
>>
>>
>>
>> ### Estos datos tengo que tener la posibilidad después de que termine
>> popen..
>>
>>             result.exit_code = p.returncode
>>
>>             result.stdout = stdout
>>
>>             result.stderr = stderr
>>
>>             result.command = comando1
>>
>>             result.convert1 = stdout.replace("\n\n", "")
>>
>>             result.convert2 = stderr.replace("\n\n", "")
>>
>>
>>
>>             if p.returncode != 0:
>>
>>                  stop_sound()
>>
>>                  loadDlg.Destroy()
>>
>>                  dlg = wx.MessageDialog(None, "Error al copiar el
>> archivo " + archivoresultado + " al Almacenamiento Interno.\n Asegúrese de
>> estar en modo Recovery, el móvil conectado al PC y detectado por Windows.\n
>> Si el error persiste igualmente asegúrese que los cables funcionan
>> correctamente.\n Revise el Log en la pantalla principal para saber el
>> resultado.", "Error", wx.OK | wx.ICON_ERROR)
>>
>>                  dlg.ShowModal()
>>
>>                  dlg.Destroy()
>>
>>                  print(result.convert1)
>>
>>                  print(result.convert2)
>>
>>                  print(time.strftime("%H:%M:%S") + " *** Fin de la copia
>> al Almacenamiento Interno de " + archivoresultado + " ***\n")
>>
>>                  errorgeneral()
>>
>>             else:
>>
>>                  stop_sound()
>>
>>                  loadDlg.Destroy()
>>
>>                  dlg = wx.MessageDialog(None, "Se a copiado
>> correctamente el archivo " + archivoresultado + " al Almacenamiento
>> Interno.\n Le dejo mas información en el Log de la pantalla principal.\n Al
>> aceptar empezara la instalación del archivo.", "Información", wx.OK |
>> wx.ICON_INFORMATION)
>>
>>                  dlg.ShowModal()
>>
>>                  dlg.Destroy()
>>
>>                  print(result.convert1)
>>
>>                  print(result.convert2)
>>
>>                  print(time.strftime("%H:%M:%S") + " *** Fin de la copia
>> al Almacenamiento Interno de " + archivoresultado + " ***\n")
>>
>>                  zipinterno1()
>>
>>             return result
>>
>>         else:
>>
>>             dlg.Destroy()
>>
>>             errorarchivo()
>>
>>
>>
>> ### Fin código
>>
>>
>>
>> Bueno estaré muy agradecido al que eche un poco de luz al cacao mental
>> que llevo sobre el tema de los hilos y agradecido por toda la información
>> que me podáis brindar.
>>
>>
>>
>> Cordiales saludos Héctor.
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>
>
> --
> --
> Àngel Lis.
>
> _______________________________________________
> Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20190314/16645ac3/attachment.html>


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