Tengo un script de Python que usa subprocesos y hace muchas solicitudes HTTP. Creo que lo que está sucediendo es que mientras una solicitud HTTP (usando urllib2) está leyendo, está bloqueando y no responde CtrlCpara detener el programa. ¿Hay alguna forma de evitar esto?
128
Respuestas:
En Windows, la única forma segura es usarlo CtrlBreak. ¡Detiene cada script de Python al instante!
(Tenga en cuenta que en algunos teclados, "Break" está etiquetado como "Pausa").
fuente
Break
? ¿Cómo lo escribo?Si presiona Ctrl+ cmientras se ejecuta un programa de Python, Python generará una
KeyboardInterrupt
excepción. Es probable que un programa que realiza muchas solicitudes HTTP tenga muchos códigos de manejo de excepciones. Si laexcept
parte del bloquetry
-except
no especifica qué excepciones debería detectar, capturará todas las excepciones, incluida laKeyboardInterrupt
que acaba de causar. Un programa de Python correctamente codificado hará uso de la jerarquía de excepciones de Python y solo capturará las excepciones derivadasException
.Si no puede cambiar el código (o necesita eliminar el programa para que sus cambios surtan efecto), puede intentar presionar Ctrl+ crápidamente. La primera de las
KeyboardInterrupt
excepciones eliminará su programa deltry
bloque y, con suerte, seKeyboardInterrupt
generará una de las excepciones posteriores cuando el programa esté fuera de untry
bloque.fuente
Si se ejecuta en el shell de Python, use Ctrl+ Z, de lo contrario, ubique el
python
proceso y elimínelo.fuente
^Z
->[1]+ Stopped
->kill %1
para detener el trabajo n. ° 1 (o el trabajo% 1 como bash lo pone)fg
lo traerá de vuelta.Ctrl+Z
no es la forma correcta de detener un script de python y debe evitarse a menos que planee reanudar el proceso en pausa.El proceso de interrupción depende del hardware y del sistema operativo. Por lo tanto, tendrá un comportamiento muy diferente dependiendo de dónde ejecute su script de Python. Por ejemplo, en máquinas con Windows tenemos Ctrl+ C(
SIGINT
) y Ctrl+ Break(SIGBREAK
).Entonces, si bien SIGINT está presente en todos los sistemas y se puede manejar y capturar, la señal SIGBREAK es específica de Windows (y se puede deshabilitar en CONFIG.SYS ) y el BIOS realmente la maneja como un vector de interrupción INT 1Bh , por lo que esta clave Es mucho más poderoso que cualquier otro. Entonces, si está utilizando un sistema operativo con sabor * nix, obtendrá diferentes resultados dependiendo de la implementación, ya que esa señal no está presente allí, pero otros sí. En Linux puede verificar qué señales están disponibles para usted:
Entonces, si desea captar la
CTRL+BREAK
señal en un sistema Linux, deberá verificar a qué señal POSIX han asignado esa clave. Las asignaciones populares son:De hecho, hay muchas más funciones disponibles en Linux, donde la SysRqtecla (Solicitud del sistema) puede cobrar vida propia ...
fuente
Este post es viejo pero recientemente me encontré con el mismo problema de Ctrl+ Cno poner fin a los scripts de Python en Linux. Usé Ctrl+ \(
SIGQUIT
).fuente
Ctrl+ DDiferencia para Windows y Linux
Resulta que a partir de Python 3.6, el intérprete de Python maneja Ctrl+ de manera Cdiferente para Linux y Windows. Para Linux, Ctrl+ Cfuncionaría sobre todo como era de esperar, sin embargo en Windows Ctrl+ C mayormente no funciona especialmente si se está ejecutando Python de bloqueo de llamadas, como
thread.join
o en espera de la respuesta web. Sin embargo, funcionatime.sleep
. Aquí está la buena explicación de lo que está sucediendo en el intérprete de Python. Tenga en cuenta que Ctrl+ CgeneraSIGINT
.Solución 1: Use Ctrl+ Breako Equivalente
Use los métodos abreviados de teclado a continuación en la ventana de terminal / consola que generará
SIGBREAK
en el nivel inferior en el sistema operativo y finalizará el intérprete de Python.Mac OS y Linux
Ctrl+ Shift+ \o Ctrl+\
Ventanas :
Solución 2: use la API de Windows
A continuación se presentan funciones prácticas que detectarán Windows e instalarán un controlador personalizado para Ctrl+ Cen la consola:
Puede usar arriba de esta manera:
Solución 3: método de votación
No prefiero ni recomiendo este método porque consume innecesariamente el procesador y la energía afecta negativamente el rendimiento.
tiempo de importación de subprocesos de importación
fuente
ctrl + c
no se cierra sino que se muestraKeyboardInterrupt
.En Mac, presione Ctrl+ \para salir de un proceso de Python conectado a una terminal.
fuente
En una terminal mac / in:
fuente
Esos pueden ayudar.
fuente
Puede abrir su administrador de tareas (ctrl + alt + delete, luego vaya al administrador de tareas) y busque Python en él y el servidor se llama (por ejemplo) _go_app (la convención de nomenclatura es: _language_app).
Si finalizo la tarea _go_app, finalizará el servidor, por lo que ir allí en el navegador dirá que "finalizó inesperadamente", también uso git bash, y cuando inicio un servidor, no puedo salir del servidor en el shell de bash con ctrl + c o ctrl + pausa, pero una vez que finalice la tarea de python (la que usa 63.7 mb), saldrá del script del servidor en bash y me permitirá usar el shell git bash.
fuente
Para el registro, lo que mató el proceso en mi Raspberry 3B + (ejecutando raspbian) fue Ctrl+ '. En mi teclado AZERTY francés, el toque 'también es el número 4.
fuente