Hola muchas gracias por vuestras respuestas.

Bien al final me funciono lanzar el hilo y dejar al usuario en una consola de resultados que tiene la aplicación:

Llamo al hilo:

def OnMenuwipesystem(self,event):

t = hilo_wipesystem()

t.start()

Bien la verdad que el hilo no necesito tener mucho control sobre el, salvo stdout y stderr junto si se proceso bien o no. Esto me funciona perfectamente:

class hilo_wipesystem(threading.Thread):

def __init__(self):

self.stdout = ""

self.stderr = ""

threading.Thread.__init__(self)

def run(self):

msg = wx.MessageDialog(None, "Esta apunto de borrar la partición SYSTEM. Esto no es reversible. \n¿Esta seguro de que desea continuar?", 'Pregunta', wx.YES_NO | wx.ICON_QUESTION)

ret = msg.ShowModal()

if ret == wx.ID_YES:

msg.Destroy

result = Result()

print(time.strftime("%H:%M:%S") + " *** Inicio WIPE SYSTEM ***\n")

play_sound()

os.chdir(directorio + "/zbin")

comando = "adb shell twrp wipe system"

p = Popen(comando, stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding='utf8', startupinfo=si)

(stdout, stderr) = p.communicate()

result.exit_code = p.returncode

result.stdout = stdout

result.stderr = stderr

result.command = comando

result.convert1 = stdout.replace("\n\n", "")

result.convert2 = stderr.replace("\n\n", "")

if p.returncode != 0:

stop_sound()

dlg = wx.MessageDialog(None, "El proceso a fallado, no se ha podido hacer WIPE SYSTEM.\n Asegúrese de estar en modo Recovery para hacer este proceso.\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 WIPE SYSTEM ***\n")

r1 = borraradbmem()

r1.start()

else:

stop_sound()

dlg = wx.MessageDialog(None, "Se realizo correctamente WIPE SYSTEM.\n No obstante revise el Log en la ventana principal.", "Información", wx.OK | wx.ICON_INFORMATION)

dlg.ShowModal()

dlg.Destroy()

print(result.convert1)

print(result.convert2)

print(time.strftime("%H:%M:%S") + " *** Fin WIPE SYSTEM ***\n")

r1 = borraradbmem()

r1.start()

return result

else:

msg.Destroy

Muchas gracias por las respuestas y no obstante al estar aprendiendo son muy valiosas para mi ya que las guardo y estudiare.

Cordiales saludos

El 14/03/2019 a las 21:33, Hiko hitokiri escribió:
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) passdef 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 <mailto: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 <mailto: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
        <mailto: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 <mailto:Python-es@python.org>
            https://mail.python.org/mailman/listinfo/python-es



-- --
        Àngel Lis.

        _______________________________________________
        Python-es mailing list
        Python-es@python.org  <mailto:Python-es@python.org>
        https://mail.python.org/mailman/listinfo/python-es
        _______________________________________________
        Python-es mailing list
        Python-es@python.org <mailto:Python-es@python.org>
        https://mail.python.org/mailman/listinfo/python-es

    _______________________________________________
    Python-es mailing list
    Python-es@python.org <mailto: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
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es

Reply via email to