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

Responder a