Hola, pues yo te doy una forma de usar lo del hilo, si te funciona bien con popen o con os eso ya es de que tu hagas tus pruebas, usando la libreria nativa de python
class KeepAliveClass(threading.Thread): """Use to calculate the time that websocket is out """ def __init__(self): threading.Thread.__init__(self) pass def start(self, **kwargs): self.objectSoap = kwargs["objetoSoap"] def stop(self): self.stoped = True def run(self): while True: self.metodo(self.dm_id, self.client_ip) print("KeepAlive4") if self.stoped: break time.sleep(120) print("close") self.objKeepAlive.start(**data_keep_alive) El jue., 14 mar. 2019 a las 12:02, Alberto Curro (<bertothun...@gmail.com>) escribió: > 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 (< > facturasxebo...@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 (< >> facturasxebo...@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@python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> >> -- >> -- >> Àngel Lis. >> >> _______________________________________________ >> Python-es mailing >> listPython-es@python.orghttps://mail.python.org/mailman/listinfo/python-es >> >> _______________________________________________ >> Python-es mailing list >> Python-es@python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es > -- hiko_hitokiri no pidas que el mundo te trate de una manera cuando tu no le das el mismo trato a los demás
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es