From anlismon en gmail.com Fri Mar 1 05:24:04 2019 From: anlismon en gmail.com (Angel Lis) Date: Fri, 1 Mar 2019 11:24:04 +0100 Subject: [Python-es] =?utf-8?q?Necesito_ayuda_con_hilos_o_alg=C3=BAn_m?= =?utf-8?q?=C3=A9todo_para_que_no_salga_el_mensaje=3A_La_aplicaci?= =?utf-8?q?=C3=B3n_no_responde=2E?= In-Reply-To: <14e269b8-0f9b-2fb3-40cf-38208b84e568@gmail.com> References: <14e269b8-0f9b-2fb3-40cf-38208b84e568@gmail.com> Message-ID: 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. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From facturasxebolax en gmail.com Fri Mar 1 19:14:47 2019 From: facturasxebolax en gmail.com (=?UTF-8?Q?H=c3=a9ctor_J=2e_Ben=c3=adtez_Corredera?=) Date: Sat, 2 Mar 2019 01:14:47 +0100 Subject: [Python-es] =?utf-8?q?Necesito_ayuda_con_hilos_o_alg=C3=BAn_m?= =?utf-8?q?=C3=A9todo_para_que_no_salga_el_mensaje=3A_La_aplicaci=C3=B3n_n?= =?utf-8?q?o_responde=2E?= In-Reply-To: References: <14e269b8-0f9b-2fb3-40cf-38208b84e568@gmail.com> Message-ID: <3553c102-c18c-c336-a69b-ab1364311b0f@gmail.com> 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 > (>) 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 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: From agtugo en gmail.com Wed Mar 6 22:11:48 2019 From: agtugo en gmail.com (AGTUGO) Date: Wed, 6 Mar 2019 19:11:48 -0800 Subject: [Python-es] Documentar imports con doxygen Message-ID: He buscado sin 'exito como documentar los imports que se hacen en python en Doxygen. Alguien lo ha hecho? Saludos. -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lasizoillo en gmail.com Thu Mar 7 04:15:27 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Thu, 7 Mar 2019 10:15:27 +0100 Subject: [Python-es] Documentar imports con doxygen In-Reply-To: References: Message-ID: El jue., 7 mar. 2019 a las 4:12, AGTUGO () escribió: > He buscado sin 'exito como documentar los imports que se hacen en python > en Doxygen. Alguien lo ha hecho? Saludos. > > Perdona que no responda a tu pregunta, pero Doxygen lo tengo olvidadísimo y me ha surgido una pregunta, ¿alguna ventaja en usar Doxygen frente a Sphinx? Un saludo, Javi > -- > Arturo Muñoz Tolosa > _______________________________________________ > 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: From agtugo en gmail.com Wed Mar 13 19:19:23 2019 From: agtugo en gmail.com (AGTUGO) Date: Wed, 13 Mar 2019 16:19:23 -0700 Subject: [Python-es] Documentar imports con doxygen In-Reply-To: References: Message-ID: Hola Javi, Doxygen donde estoy desarrollando un proyecto, esta bastante personalizado, tienen DSL que esta agregado Doxygen, etc. Migrar todo el sistema de documentacion ser'ia una labor titanica. On Thu, Mar 7, 2019 at 1:16 AM lasizoillo wrote: > > > El jue., 7 mar. 2019 a las 4:12, AGTUGO () escribió: > >> He buscado sin 'exito como documentar los imports que se hacen en python >> en Doxygen. Alguien lo ha hecho? Saludos. >> >> > Perdona que no responda a tu pregunta, pero Doxygen lo tengo olvidadísimo > y me ha surgido una pregunta, ¿alguna ventaja en usar Doxygen frente a > Sphinx? > > Un saludo, > > Javi > > >> -- >> Arturo Muñoz Tolosa >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From bertothunder en gmail.com Thu Mar 14 14:01:50 2019 From: bertothunder en gmail.com (Alberto Curro) Date: Thu, 14 Mar 2019 19:01:50 +0100 Subject: [Python-es] =?utf-8?q?Necesito_ayuda_con_hilos_o_alg=C3=BAn_m?= =?utf-8?q?=C3=A9todo_para_que_no_salga_el_mensaje=3A_La_aplicaci?= =?utf-8?q?=C3=B3n_no_responde=2E?= In-Reply-To: <3553c102-c18c-c336-a69b-ab1364311b0f@gmail.com> References: <14e269b8-0f9b-2fb3-40cf-38208b84e568@gmail.com> <3553c102-c18c-c336-a69b-ab1364311b0f@gmail.com> Message-ID: 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: From lastvnm en gmail.com Thu Mar 14 16:33:37 2019 From: lastvnm en gmail.com (Hiko hitokiri) Date: Thu, 14 Mar 2019 14:33:37 -0600 Subject: [Python-es] =?utf-8?q?Necesito_ayuda_con_hilos_o_alg=C3=BAn_m?= =?utf-8?q?=C3=A9todo_para_que_no_salga_el_mensaje=3A_La_aplicaci?= =?utf-8?q?=C3=B3n_no_responde=2E?= In-Reply-To: References: <14e269b8-0f9b-2fb3-40cf-38208b84e568@gmail.com> <3553c102-c18c-c336-a69b-ab1364311b0f@gmail.com> Message-ID: 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 () 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 (< > 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 >> > _______________________________________________ > Python-es mailing list > Python-es en 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 ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From facturasxebolax en gmail.com Thu Mar 14 16:35:30 2019 From: facturasxebolax en gmail.com (=?UTF-8?Q?H=c3=a9ctor_J=2e_Ben=c3=adtez_Corredera?=) Date: Thu, 14 Mar 2019 21:35:30 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFSe_puede_llamar_una_funci=C3=B3n_de_?= =?utf-8?q?una_Clase_desde_otra=3F?= Message-ID: Hola me gustaría preguntar si se puede hacer una llamada a una clase desde otra clase. E visto en distintos sitios varías maneras pero las e puesto en practica y algo no estoy haciendo bien. Bien este es el código: import wx import threading class VentanaPrincipal(wx.Frame): """Clase de la ventana principal""" def __init__(self): wx.Frame.__init__(self, None, title=VersionAPP ) # barra de menus menuBar = wx.MenuBar() menu_conf = wx.Menu() item = menu_conf.Append(101, "&1 Hacer WIPE SYSTEM (Modo Recovery)\tCtrl+1", "Borra la partición SYSTEM. Acción no reversible.") self.Bind(wx.EVT_MENU, self.OnMenuwipesystem, item) item = menu_conf.Append(102, "&2 Hacer WIPE DATA (Modo Recovery)\tCtrl+2", "Borra la partición DATA. Acción no reversible.") self.Bind(wx.EVT_MENU, self.OnMenuwipedata, item) item = menu_conf.Append(103, "&3 Hacer WIPE CACHE (Modo Recovery)\tCtrl+3", "Borra la partición CACHE. Acción no reversible.") self.Bind(wx.EVT_MENU, self.OnMenuwipecache, item) item = menu_conf.Append(104, "&4 Hacer WIPE DALVIK (Modo Recovery)\tCtrl+4", "Borra la partición DALVIK. Acción no reversible.") self.Bind(wx.EVT_MENU, self.OnMenuwipedalvik, item) item = menu_conf.Append(105, "&5 Borra el Almacenamiento Interno (Modo Recovery)\tCtrl+5", "Elimina todo el contenido del Almacenamiento Interno. Acción no reversible.") self.Bind(wx.EVT_MENU, self.OnMenuwipeinterno, item) item = menu_conf.Append(106, "&6 Hacer todos los WIPES (Modo Recovery)\tCtrl+6", "Hace todos los WIPES juntos. Se detendrá si se produce algún error. Acción no reversible.") self.Bind(wx.EVT_MENU, self.OnMenuwipecompleto, item) menuBar.Append(menu_conf, "WIPES") self.SetMenuBar(menuBar) # paneles panel = wx.Panel(self, wx.ID_ANY) # widgets Bien CONFIGURO LOS Widgets? Y AHORA VIENE LOS DEF DE LOS MENUS, PONGO UNO DE PRUEBA: def OnMenuwipesystem(self,event): self.MenuBar.EnableTop(0, False) # Deshabilito EL MENÚ wipes t = hilo_wipesystem() t.start() Bien lo importante es que e deshabilitado el menú WIPES ya que no deseo que se use mientras el hilo esta en ejecución bien el problema es que llamo al hilo en otra clase pero no se como volver a activar el menú ya que e probado de todo y no hay manera siempre me da error. Sobre todo que self ya esta definido en la clase del hilo. Bien pongo el hilo: class hilo_wipesystem(threading.Thread): def __init__(self): self.stdout = "" self.stderr = "" threading.Thread.__init__(self) def run(self): Bien desarrollo el hilo y cuando termina quiero volver a activar el menú WIPES. self.MenuBar.EnableTop(0, True) # Quiero volver activar el menú WIPES Decir que me da error cambiando self por VentanaPrincipal e probado todas las combinaciones pero no entiendo o no comprendo bien si se puede llamar de una clase a otra. Os DEJO IGUALMENTE LA PARTE FINAL: ### Inicio clase Aplicación class Aplicacion(wx.App): """Clase de la aplicacion.""" def OnInit(self): self.ventana = VentanaPrincipal() self.ventana.Show(True) #self.SetTopWindow(self.ventana) return True if __name__ == '__main__': aplicacion = Aplicacion() aplicacion.MainLoop() ### Fin clase Aplicación Muchas gracias de antemano. Cordiales saludos. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From facturasxebolax en gmail.com Thu Mar 14 16:45:55 2019 From: facturasxebolax en gmail.com (=?UTF-8?Q?H=c3=a9ctor_J=2e_Ben=c3=adtez_Corredera?=) Date: Thu, 14 Mar 2019 21:45:55 +0100 Subject: [Python-es] =?utf-8?q?Necesito_ayuda_con_hilos_o_alg=C3=BAn_m?= =?utf-8?q?=C3=A9todo_para_que_no_salga_el_mensaje=3A_La_aplicaci=C3=B3n_n?= =?utf-8?q?o_responde=2E?= In-Reply-To: References: <14e269b8-0f9b-2fb3-40cf-38208b84e568@gmail.com> <3553c102-c18c-c336-a69b-ab1364311b0f@gmail.com> Message-ID: <4e971f27-e0d8-b6b6-dbd6-f7c043d4c3d6@gmail.com> 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 > (>) 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 > (>) > 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 >> (> >) 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 list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > _______________________________________________ > Python-es mailing list > Python-es en 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 en python.org > https://mail.python.org/mailman/listinfo/python-es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Fri Mar 15 21:47:05 2019 From: agtugo en gmail.com (AGTUGO) Date: Fri, 15 Mar 2019 18:47:05 -0700 Subject: [Python-es] metodo mas pythonico para strings multilinea con variables largas Message-ID: Objetivo de esta discusi'on no es llegar a un "depende del gusto" , el objetivo es determinar con las guias de estilo disponibles, que es lo mas pythonico. Saludos. Hay una discusion similar aqui https://stackoverflow.com/questions/10660435/pythonic-way-to-create-a-long-multi-line-string pero el nombre de la variable es corto # El problema es que tengo que partir muchas veces el string cuando la variable tiene #un nombre muy largo a pesar del inconveniente que esto representa estoy a favor #de nombres descriptivos para las variables # lo que quiero evitar es partir muchas veces la linea #Aclaro que esto ya es pythonico pero quiero ahorrar espacio. this_is_a_very_long_variable = "this is my really, really, really, really, really, really," \ "really, really, really really, really, really, really, really," \ " really long string that I'd like to shorten." #Esta Solucion me parece adecuada, solo el inconveniente de escribir la diagonal #en cada caso, ganamos espacio y agregamos identacion para identificar que es parte #del string this_is_a_very_long_variable = \ "this is my really, really, really, really, really, really," \ "really, really, really really, really, really, really, really," \ " really long string that I'd like to shorten." #Mi metodo favorito hasta ahora, no hay necesidad de agregar una diagonal en cada #linea, me molesta un poco visualmente el parentesis (supongo que para eso no hay solucion) this_is_a_very_long_variable = ( "this is my really, really, really, really, really, really," "really, really, really really, really, really, really, really," " really long string that I'd like to shorten.") #esto agrega saltos de linea y me parece una solucion muy fea porque no hay identacion #no es realmente una solucion pero es para ver si la de ideas a alguien. this_is_a_very_long_variable = \ """this is my really, really, really, really, really, really, really, really, really really, really, really, really, really, really long string that I'd like to shorten.""" -- Arturo Muñoz ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Sat Mar 16 07:31:27 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Sat, 16 Mar 2019 12:31:27 +0100 Subject: [Python-es] metodo mas pythonico para strings multilinea con variables largas In-Reply-To: References: Message-ID: El sáb., 16 mar. 2019 a las 2:47, AGTUGO () escribió: > Objetivo de esta discusi'on no es llegar a un "depende del gusto" , el > objetivo es determinar con las guias de estilo disponibles, que es lo mas > pythonico. Saludos. > > Según el Zen de Python: "There should be one-- and preferably only one --obvious way to do it." Me temo que en este caso tenemos demasiadas formas de hacer una misma cosa. Hay una discusion similar aqui > https://stackoverflow.com/questions/10660435/pythonic-way-to-create-a-long-multi-line-string > pero el nombre de la variable es corto > > > # El problema es que tengo que partir muchas veces el string cuando la > variable tiene > #un nombre muy largo a pesar del inconveniente que esto representa estoy a > favor > #de nombres descriptivos para las variables > > # lo que quiero evitar es partir muchas veces la linea > #Aclaro que esto ya es pythonico pero quiero ahorrar espacio. > this_is_a_very_long_variable = "this is my really, really, really, > really, really, really," \ > "really, really, > really really, really, really, really, really," \ > " really long string > that I'd like to shorten." > > #Esta Solucion me parece adecuada, solo el inconveniente de escribir la > diagonal > #en cada caso, ganamos espacio y agregamos identacion para identificar que > es parte > #del string > > this_is_a_very_long_variable = \ > "this is my really, really, really, really, really, really," \ > "really, really, really really, really, really, really, really," \ > " really long string that I'd like to shorten." > > #Mi metodo favorito hasta ahora, no hay necesidad de agregar una diagonal > en cada > #linea, me molesta un poco visualmente el parentesis (supongo que para eso > no hay solucion) > > this_is_a_very_long_variable = ( > "this is my really, really, really, really, really, really," > "really, really, really really, really, really, really, really," > " really long string that I'd like to shorten.") > > Atendiendo a las reglas de estilo (PEP8): "The preferred way of wrapping long lines is by using Python's implied line continuation inside parentheses, brackets and braces". O sea, la preferida sería la última que has puesto con los paréntesis. No entiendo porqué te molesta el paréntesis. La mayoría de los IDEs ya se encargan de cerrar el paréntesis y las comillas mientras escribes, por lo que es bastante cómodo. Visualmente se puede confundir con una tupla, eso sí. El carácter de continuación ('\') está desaconsejado últimamente y sólo habría algún caso para el que siga siendo práctico. > #esto agrega saltos de linea y me parece una solucion muy fea porque no > hay identacion > #no es realmente una solucion pero es para ver si la de ideas a alguien. > > this_is_a_very_long_variable = \ > """this is my really, really, really, really, really, really, > really, really, really really, really, really, really, really, > really long string that I'd like to shorten.""" > > No es lo mismo una string en varias líneas que una string multilínea. Sin tener en cuenta que los saltos de línea, el margen se podría haber resuelto al estilo scala, quitándolo al final: this_is_a_very_long_variable = """ |this is my really, really, really, really, really, really, |really, really, really really, really, really, really, really, |really long string that I'd like to shorten.""".*stripMargin* Los IDEs de scala facilitan la escritura añadiendo automáticamente el margen al saltar de línea. En python no queda más remedio que crear una función para que lo haga, o bien, usar expresiones regulares: import re strip_margin = re.compile("\n\W*\|") this_is_a_very_long_variable = strip_margin.sub('', """ |this is my really, really, really, really, really, really, |really, really, really really, really, really, really, really, |really long string that I'd like to shorten.""") Saludos > -- > Arturo Muñoz > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pixukideak en gmail.com Fri Mar 22 06:11:08 2019 From: pixukideak en gmail.com (Pixu Kideak) Date: Fri, 22 Mar 2019 11:11:08 +0100 Subject: [Python-es] Desplegar desarrollos en distintos servidores Message-ID: Buenos días, Estoy aprendiendo Python, he realizado algún script que utiliza algunas librerias de terceros que los he puesto en marcha con PIP y tengo funcionando el programa en un servidor. Me gustaría saber cual es la mejor manera para poder hacer funcionar el desarrollo en otros servidores con distintas arquitecturas (x32, x64) y distintos sistemas operativos. En un principio he pensado que podría instalar Python y las librerias en los distintos servidores y después copiar los scripts; pero quiero pensar que existe alguna manera de automatizar este proceso o realizarlo de manera más elegante. Un saludo y muchas gracias por vuestra ayuda ;-) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kelertxiki en gmail.com Fri Mar 22 08:47:03 2019 From: kelertxiki en gmail.com (Ander Garmendia) Date: Fri, 22 Mar 2019 13:47:03 +0100 Subject: [Python-es] Desplegar desarrollos en distintos servidores In-Reply-To: References: Message-ID: Échale un vistazo a Ansible. El vie., 22 mar. 2019 11:12, Pixu Kideak escribió: > Buenos días, > > Estoy aprendiendo Python, he realizado algún script que utiliza algunas > librerias de terceros que los he puesto en marcha con PIP y tengo > funcionando el programa en un servidor. > Me gustaría saber cual es la mejor manera para poder hacer funcionar el > desarrollo en otros servidores con distintas arquitecturas (x32, x64) y > distintos sistemas operativos. > > En un principio he pensado que podría instalar Python y las librerias en > los distintos servidores y después copiar los scripts; pero quiero pensar > que existe alguna manera de automatizar este proceso o realizarlo de manera > más elegante. > > Un saludo y muchas gracias por vuestra ayuda ;-) > > > _______________________________________________ > 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: From anlismon en gmail.com Fri Mar 22 08:49:59 2019 From: anlismon en gmail.com (Angel Lis) Date: Fri, 22 Mar 2019 13:49:59 +0100 Subject: [Python-es] Desplegar desarrollos en distintos servidores In-Reply-To: References: Message-ID: Hola Pixu, Tienes varias opciones para eso. La mas directa es utilizar virtualenv para tu proyecto ya que es bastante sencillo de usar y te ahorrara muchos problemas. el modo de trabajo eso es siguiente. Creas un 'virtualenv' para tu proyecto: $ cd myprojectdir ejecutas python -m venv DIRECTORIO_DONDE_TENDRAS_VENV Esto crea una "copia local especifica para tu sistema'. Vamos, que copia el ejecutable de python, el pip, libs, etc dentro de ese directorio. $ python -m venv venv Activas el entorno virtual: $ source ./venv/bin/activate # Para *nix systems $ .\venv\scripts\activate # para Windoze. instalas los requerimientos $ pip install -r requeriments.txt Ejecutas lo que quieras: $python my_super_programa.py Algunas cosas interesantes. Cuando tengas tu proyecto listo, o simplemente has hecho pruebas y funciona bien, es recomendable crearte un 'requeriments.txt' con las librerias de terceros que uses y la version EXACTA que estas usando, asi podras evitar el Version Hell $ pip freeze > requeriment.txt Por que es una buena idea hacer esto, pues inicialmente para usar siempre la misma libreria con la que has comprobado que tu sistema funciona. Luego para evitar que, si tienes las librerias instaladas a nivel de sistema o de tu usuario local, haya incompatibilidades entre software. Tipico este programa necesita numpy==10.x y este otro un numpy<=11.x, con tu virtualenv tienes en cada sistema la lib que necesitas. Otra opcion que puedes hacer es desplegar tu proyecto dentro de un docker. Para las ventajas, desventajas, problemas y tips de docker, pregunta en un mail aparte ;) PS: me quedo sin timpo para responder mas extensamente. PS2: sorry por las tildes, teclado ingles. El vie., 22 mar. 2019 a las 11:12, Pixu Kideak () escribió: > Buenos días, > > Estoy aprendiendo Python, he realizado algún script que utiliza algunas > librerias de terceros que los he puesto en marcha con PIP y tengo > funcionando el programa en un servidor. > Me gustaría saber cual es la mejor manera para poder hacer funcionar el > desarrollo en otros servidores con distintas arquitecturas (x32, x64) y > distintos sistemas operativos. > > En un principio he pensado que podría instalar Python y las librerias en > los distintos servidores y después copiar los scripts; pero quiero pensar > que existe alguna manera de automatizar este proceso o realizarlo de manera > más elegante. > > Un saludo y muchas gracias por vuestra ayuda ;-) > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- -- Àngel Lis. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Wed Mar 27 09:28:27 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 27 Mar 2019 14:28:27 +0100 Subject: [Python-es] Desplegar desarrollos en distintos servidores In-Reply-To: References: Message-ID: El vie., 22 mar. 2019 a las 11:11, Pixu Kideak () escribió: > Buenos días, > > Estoy aprendiendo Python, he realizado algún script que utiliza algunas > librerias de terceros que los he puesto en marcha con PIP y tengo > funcionando el programa en un servidor. > Me gustaría saber cual es la mejor manera para poder hacer funcionar el > desarrollo en otros servidores con distintas arquitecturas (x32, x64) y > distintos sistemas operativos. > > En un principio he pensado que podría instalar Python y las librerias en > los distintos servidores y después copiar los scripts; pero quiero pensar > que existe alguna manera de automatizar este proceso o realizarlo de manera > más elegante. > > Al usar distintas arquitecturas, dependerá mucho de los módulos que vayas a instalar y si requieren de librerías del sistema aparte de las que usa python. Como norma principal: nunca modifiques el entorno python del sistema operativo. Cambiar las versiones de python y sus módulos podrían afectar al funcionamiento del sistema. Crea entornos virtuales tal como te comenta Ángel Lis en otro mensaje. Lo bueno de un entorno virtual es que puedes poder la versión de python que necesites (por ejemplo, usar python 3.6 en tu aplicación mientras el sistema sigue usando python 2.7). Para crear entornos virtuales, te recomiendo conda 4.6. Es un instalador de paquetes python que también instala dependencias, librerías nativas e, incluso, librerías de R y ruby. El módulo menv (que te recomienda Ángel Lis) está bien para instalar paquetes 100% python, pero tiene dos graves incovenientes: 1. Requiere de un entorno de desarrollo para compilar algunas dependencias 2. La lista de paquetes que saca pip freeze puede ser difícil de reproducir de un sistema operativo a otro Crear un entorno de desarrollo en linux no es mayor problema; pero si usas windows puede que tengas dificultades para que compilen cierto ciertos módulos. En cuanto a la lista de paquetes que genera pip freeze, puede ser demasiado extensa. Lo normal es que tu aplicación sólo dependa de unos pocos paquetes, y el resto sea parte del sistema. Conda dispone de librerías ya compiladas para los sistemas operativos habituales. Además minimiza el listado de paquetes a instalar para recrear un entorno. Ejemplo de una sesión: $ conda create -n mientorno python==3.6 flask $ conda activate mientorno (mientorno) $ python >>> Para recrear el entorno en otra máquina. En origen: $ conda env export -n mientorno > environment.yml En la otra máquina: $ conda env create -f environment.yml Para los despliegues (y control remoto) recomiendo fabric+invoke. El uso de Ansible y similares lo veo más para cuando se tiene un gran número de entornos a gestionar (aunque también es factible usar fabric por encima de ansible para hacer más simple su uso). [conda]: https://conda.io [invoke]: https://www.pyinvoke.org/ [fabric]: http://www.fabfile.org/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: