strings run online lib2to3 how from convertidor code change 2to3 python termination

run - Terminando un script de Python



python 2 vs 3 strings (10)

Acabo de descubrir que al escribir una aplicación multiproceso, raise SystemExit y sys.exit() ambos solo sys.exit() el subproceso en ejecución. Por otro lado, os._exit() sale de todo el proceso. Esto fue discutido here.

El siguiente ejemplo tiene 2 hilos. Kenny y Cartman. Se supone que Cartman debe vivir para siempre, pero a Kenny se le llama recursivamente y debe morir después de 3 segundos. (La llamada recursiva no es la mejor manera, pero tuve otras razones)

Si también queremos que Cartman muera cuando Kenny muera, Kenny debería irse con os._exit , de lo contrario, solo Kenny morirá y Cartman vivirá para siempre.

import threading import time import sys import os def kenny(num=0): if num > 3: # print("Kenny dies now...") # raise SystemExit #Kenny will die, but Cartman will live forever # sys.exit(1) #Same as above print("Kenny dies and also kills Cartman!") os._exit(1) while True: print("Kenny lives: {0}".format(num)) time.sleep(1) num += 1 kenny(num) def cartman(): i = 0 while True: print("Cartman lives: {0}".format(i)) i += 1 time.sleep(1) if __name__ == ''__main__'': daemon_kenny = threading.Thread(name=''kenny'', target=kenny) daemon_cartman = threading.Thread(name=''cartman'', target=cartman) daemon_kenny.setDaemon(True) daemon_cartman.setDaemon(True) daemon_kenny.start() daemon_cartman.start() daemon_kenny.join() daemon_cartman.join()

Soy consciente del comando die() en PHP que detiene un script antes.

¿Cómo puedo hacer esto en Python?


En Python 3.5, intenté incorporar un código similar sin usar módulos (por ejemplo, sys, Biopy) que no sea lo que está incorporado para detener el script e imprimir un mensaje de error a mis usuarios. Aquí está mi ejemplo:

## My example: if "ATG" in my_DNA: ## <Do something & proceed...> else: print("Start codon is missing! Check your DNA sequence!"); exit(); ## as most folks said above

Más tarde, descubrí que es más breve simplemente lanzar un error:

## My example revised: if "ATG" in my_DNA: ## <Do something & proceed...> else: raise ValueError("Start codon is missing! Check your DNA sequence!");


Otra forma es:

raise SystemExit


Si bien generalmente debería preferir sys.exit porque es más "amigable" que el otro código, todo lo que realmente hace es generar una excepción.

Si está seguro de que necesita salir de un proceso inmediatamente, y podría estar dentro de algún controlador de excepciones que detectaría SystemExit , existe otra función, os._exit , que termina inmediatamente en el nivel C y no realiza ninguna de las os._exit . desmontaje normal del intérprete; por ejemplo, los ganchos registrados con el módulo "atexit" no se ejecutan.


Soy un novato total, pero seguramente esto es más limpio y más controlado.

def main(): try: Answer = 1/0 print Answer except: print ''Program terminated'' return print ''You wont see this'' if __name__ == ''__main__'': main()

...

Programa terminado

que

import sys def main(): try: Answer = 1/0 print Answer except: print ''Program terminated'' sys.exit() print ''You wont see this'' if __name__ == ''__main__'': main()

...

Programa finalizado Traceback (última llamada más reciente): Archivo "Z: / Directory / testdieprogram.py", línea 12, en main () Archivo "Z: / Directory / testdieprogram.py", línea 8, en main sys.exit ( ) SystemExit

Editar

El punto es que el programa termina sin problemas y en paz, en lugar de "¡HE PARADO!"


También puede utilizar simplemente exit() .

Tenga en cuenta que sys.exit() , exit() , quit() y os._exit(0) matan al intérprete de Python. Por lo tanto, si aparece en un script llamado desde otro script por execfile() , detiene la ejecución de ambos scripts.

Consulte " Detener la ejecución de un script llamado con execfile " para evitar esto.


Una forma sencilla de terminar un script de Python temprano es usar la función integrada quit (). No hay necesidad de importar ninguna biblioteca, y es eficiente y simple.

Ejemplo:

#do stuff if this == that: quit()


intente usar break después de un bucle, luego use quit () o exit ().


from sys import exit exit()

Como parámetro, puede pasar un código de salida, que se devolverá al sistema operativo. El valor predeterminado es 0.


import sys sys.exit()

Detalles de la documentación del módulo sys :

sys. exit ([ arg ])

Salir de Python. Esto se implementa al elevar la excepción SystemExit , por lo que se SystemExit acciones de limpieza especificadas por las cláusulas finally de las sentencias try , y es posible interceptar el intento de salida en un nivel externo.

El argumento opcional arg puede ser un número entero que dé el estado de salida (por defecto a cero) u otro tipo de objeto. Si es un número entero, cero se considera "terminación exitosa" y cualquier valor distinto de cero se considera "terminación anormal" por shells y similares. La mayoría de los sistemas requieren que esté en el rango 0-127 y, de lo contrario, producen resultados indefinidos. Algunos sistemas tienen una convención para asignar significados específicos a códigos de salida específicos, pero estos generalmente están poco desarrollados; Los programas Unix generalmente usan 2 para los errores de sintaxis de la línea de comandos y 1 para todos los demás tipos de errores. Si se pasa otro tipo de objeto, Ninguno es equivalente a pasar cero, y cualquier otro objeto se imprime a stderr y da como resultado un código de salida de 1. En particular, sys.exit("some error message") es una forma rápida de salir de un programa cuando se produce un error.

Como exit() finalmente "solo" genera una excepción, solo saldrá del proceso cuando se le llame desde el hilo principal, y la excepción no se intercepta.

Tenga en cuenta que esta es la "buena" manera de salir. @ glyphtwistedmatrix continuación señala que si desea una ''salida difícil'', puede usar os._exit ( errorcode ), aunque es probable que sea específico de os hasta cierto punto (es posible que no tenga un código de error en Windows, por ejemplo), y definitivamente es menos amigable ya que no permite que el intérprete realice ninguna limpieza antes de que el proceso muera.