J'ai un script python qui utilise des threads et fait beaucoup de requêtes HTTP. Je pense que ce qui se passe, c'est que pendant la lecture d'une requête HTTP (utilisant urllib2), elle bloque et ne répond pas CtrlCpour arrêter le programme. Y a-t-il un moyen de contourner cela?
128
Réponses:
Sous Windows, le seul moyen sûr est d'utiliser CtrlBreak. Arrête instantanément chaque script python!
(Notez que sur certains claviers, "Pause" est étiqueté comme "Pause".)
la source
Break
? Comment puis-je le saisir?Si vous appuyez sur Ctrl+ cpendant l'exécution d'un programme python, python lèvera une
KeyboardInterrupt
exception. Il est probable qu'un programme qui fait beaucoup de requêtes HTTP aura beaucoup de code de gestion des exceptions. Si laexcept
partie du bloctry
-except
ne spécifie pas les exceptions qu'elle doit intercepter, elle interceptera toutes les exceptions, y compris cellesKeyboardInterrupt
que vous venez de provoquer. Un programme python correctement codé utilisera la hiérarchie des exceptions python et n'attrapera que les exceptions dérivéesException
.Si vous ne pouvez pas changer le code (ou devez tuer le programme pour que vos modifications prennent effet), vous pouvez essayer d'appuyer sur Ctrl+ crapidement. La première des
KeyboardInterrupt
exceptions éliminera votre programme dutry
bloc et, espérons-le, l'une des dernièresKeyboardInterrupt
exceptions sera déclenchée lorsque le programme est en dehors d'untry
bloc.la source
S'il s'exécute dans le shell Python, utilisez Ctrl+ Z, sinon localisez le
python
processus et tuez-le.la source
^Z
->[1]+ Stopped
->kill %1
pour arrêter le travail n ° 1 (ou le travail% 1 comme le dit bash)fg
le ramènera tout de suite.Ctrl+Z
n'est pas la bonne façon d'arrêter un script python et doit être évité à moins que vous ne prévoyiez de reprendre le processus en pause.Le processus d'interruption dépend du matériel et du système d'exploitation. Vous aurez donc un comportement très différent selon l'endroit où vous exécutez votre script python. Par exemple, sur les machines Windows, nous avons Ctrl+ C(
SIGINT
) et Ctrl+ Break(SIGBREAK
).Ainsi, alors que SIGINT est présent sur tous les systèmes et peut être manipulé et capturé, le signal SIGBREAK est spécifique à Windows (et peut être désactivé dans CONFIG.SYS ) et est vraiment géré par le BIOS comme un vecteur d'interruption INT 1Bh , c'est pourquoi cette touche est beaucoup plus puissant que tout autre. Donc, si vous utilisez un système d'exploitation à saveur * nix, vous obtiendrez des résultats différents selon l'implémentation, puisque ce signal n'est pas présent, mais d'autres le sont. Sous Linux, vous pouvez vérifier quels signaux vous sont disponibles en:
Donc, si vous voulez capturer le
CTRL+BREAK
signal sur un système Linux, vous devrez vérifier à quel signal POSIX ils ont mappé cette clé. Les mappages populaires sont:En fait, de nombreuses autres fonctions sont disponibles sous Linux, où la SysRqtouche (System Request) peut prendre une vie propre ...
la source
Ce post est ancien mais j'ai récemment rencontré le même problème de Ctrl+ Cne pas terminer les scripts Python sous Linux. J'ai utilisé Ctrl+ \(
SIGQUIT
).la source
Ctrl+ DDifférence pour Windows et Linux
Il s'avère qu'à partir de Python 3.6, l'interpréteur Python gère Ctrl+ Cdifféremment pour Linux et Windows. Pour Linux, Ctrl+ Cfonctionnerait essentiellement comme prévu mais sur Windows Ctrl+ la C plupart du temps ne fonctionne pas , surtout si Python est le blocage des appels en cours d' exécution tels que
thread.join
ou en attente de la réponse Web. Cela fonctionne pourtime.sleep
, cependant. Voici la belle explication de ce qui se passe dans l'interpréteur Python. Notez que Ctrl+ CgénèreSIGINT
.Solution 1: utiliser Ctrl+ Breakou équivalent
Utilisez ci-dessous les raccourcis clavier dans la fenêtre du terminal / console qui généreront
SIGBREAK
au niveau inférieur du système d'exploitation et mettront fin à l'interpréteur Python.Mac OS et Linux
Ctrl+ Shift+ \ou Ctrl+\
Windows :
Solution 2: utiliser l'API Windows
Vous trouverez ci-dessous des fonctions pratiques qui détecteront Windows et installeront le gestionnaire personnalisé pour Ctrl+ Cdans la console:
Vous pouvez utiliser ci-dessus comme ceci:
Solution 3: méthode d'interrogation
Je ne préfère ni ne recommande cette méthode car elle consomme inutilement du processeur et de l'énergie, ce qui a un impact négatif sur les performances.
importation du temps d'importation des threads
la source
ctrl + c
ne quitte pas mais s'afficheKeyboardInterrupt
.Sur Mac, appuyez sur Ctrl+ \pour quitter un processus python attaché à un terminal.
la source
Sur un Mac / dans Terminal:
la source
Cela peut aider.
la source
Vous pouvez ouvrir votre gestionnaire de tâches (ctrl + alt + supprimer, puis aller dans le gestionnaire de tâches) et chercher python et le serveur est appelé (pour l'exemple) _go_app (la convention de dénomination est: _language_app).
Si je termine la tâche _go_app, cela mettra fin au serveur, donc aller là-bas dans le navigateur dira que cela s'est terminé de manière inattendue, j'utilise également git bash, et lorsque je démarre un serveur, je ne peux pas sortir du serveur dans le shell de bash avec ctrl + c ou ctrl + pause, mais une fois que vous avez terminé la tâche python (celle qui utilise 63,7 mb), elle sortira du script serveur dans bash et me permettra d'utiliser le shell git bash.
la source
Pour mémoire, ce qui a tué le processus sur mon Raspberry 3B + (exécutant raspbian) était Ctrl+ '. Sur mon clavier français AZERTY, le toucher 'est également le numéro 4.
la source