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