Ich habe ein Python-Skript, das Threads verwendet und viele HTTP-Anfragen stellt. Ich denke, was passiert ist, dass während eine HTTP-Anfrage (mit urllib2) gelesen wird, sie blockiert und nicht reagiert CtrlC, um das Programm zu stoppen. Gibt es einen Weg daran vorbei?
128
Antworten:
Unter Windows ist die Verwendung nur sicher CtrlBreak. Stoppt jedes Python-Skript sofort!
(Beachten Sie, dass auf einigen Tastaturen "Pause" als "Pause" gekennzeichnet ist.)
quelle
Break
? Wie schreibe ich es?Wenn Sie Ctrl+ drücken, cwährend ein Python-Programm ausgeführt wird, löst Python eine
KeyboardInterrupt
Ausnahme aus. Es ist wahrscheinlich, dass ein Programm, das viele HTTP-Anforderungen stellt, viel Code für die Ausnahmebehandlung enthält. Wenn derexcept
Teil destry
-except
Block nicht angibt , welche Ausnahmen sollte es fangen, werden alle Ausnahmen , darunter fangen die ,KeyboardInterrupt
dass Sie gerade verursacht. Ein ordnungsgemäß codiertes Python-Programm verwendet die Python-Ausnahmehierarchie und fängt nur Ausnahmen ab, von denen abgeleitet wirdException
.Wenn Sie den Code nicht ändern können (oder das Programm beenden müssen, damit Ihre Änderungen wirksam werden), können Sie versuchen, schnell Ctrl+ zu drücken c. Die erste der
KeyboardInterrupt
Ausnahmen wird Ihr Programm aus demtry
Block werfen und hoffentlich wird eine der späterenKeyboardInterrupt
Ausnahmen ausgelöst, wenn sich das Programm außerhalb einestry
Blocks befindet.quelle
Wenn es in der Python-Shell ausgeführt wird, verwenden Sie Ctrl+ Z, andernfalls suchen Sie den
python
Prozess und beenden Sie ihn.quelle
^Z
->[1]+ Stopped
->kill %1
um Job # 1 zu stoppen (oder Job% 1, wie Bash es ausdrückt)fg
bringt das Tippen es gleich zurück.Ctrl+Z
Dies ist nicht der richtige Weg, um ein Python-Skript zu stoppen, und sollte vermieden werden, es sei denn, Sie planen, den angehaltenen Prozess fortzusetzen.Der Interrupt-Prozess ist hardware- und betriebssystemabhängig. Sie haben also ein sehr unterschiedliches Verhalten, je nachdem, wo Sie Ihr Python-Skript ausführen. Auf Windows-Computern haben wir beispielsweise Ctrl+ C(
SIGINT
) und Ctrl+ Break(SIGBREAK
).Während SIGINT auf allen Systemen vorhanden ist und verarbeitet und abgefangen werden kann, ist das SIGBREAK-Signal Windows-spezifisch (und kann in CONFIG.SYS deaktiviert werden ) und wird vom BIOS tatsächlich als Interrupt-Vektor INT 1Bh behandelt , weshalb dieser Schlüssel ist viel mächtiger als jeder andere. Wenn Sie also ein Betriebssystem mit * nix-Geschmack verwenden, erhalten Sie je nach Implementierung unterschiedliche Ergebnisse, da dieses Signal dort nicht vorhanden ist, andere jedoch. Unter Linux können Sie überprüfen, welche Signale Ihnen zur Verfügung stehen, indem Sie:
Wenn Sie also das
CTRL+BREAK
Signal auf einem Linux-System abfangen möchten, müssen Sie überprüfen, auf welches POSIX-Signal sie diesen Schlüssel abgebildet haben. Beliebte Zuordnungen sind:Tatsächlich stehen unter Linux viel mehr Funktionen zur Verfügung, bei denen der SysRqSchlüssel (Systemanforderung) ein Eigenleben annehmen kann ...
quelle
Dieser Beitrag ist alt , aber ich vor kurzem lief in das gleiche Problem von Ctrl+ Cnicht beendet Python - Skripte auf Linux. Ich habe Ctrl+ \(
SIGQUIT
) verwendet.quelle
Ctrl+ DUnterschied für Windows und Linux
Es stellt sich heraus, dass der Python-Interpreter ab Python 3.6 für Linux und Windows Ctrl+ Cunterschiedlich behandelt. Unter Linux würde Ctrl+ meistens wie erwartet funktionieren, unter Windows + jedoch meistens nicht, insbesondere wenn Python einen blockierenden Aufruf ausführt, z. B. auf eine Webantwort wartet. Es funktioniert jedoch für. Hier ist die nette Erklärung, was im Python-Interpreter vor sich geht. Beachten Sie, dass + generiert .CCtrlC
thread.join
time.sleep
CtrlCSIGINT
Lösung 1: Verwenden Sie Ctrl+ Breakoder Äquivalent
Verwenden Sie die folgenden Tastenkombinationen im Terminal- / Konsolenfenster, die
SIGBREAK
im Betriebssystem auf einer niedrigeren Ebene generiert werden, und beenden Sie den Python-Interpreter.Mac OS und Linux
Ctrl+ Shift+ \oder Ctrl+\
Windows :
Lösung 2: Verwenden Sie die Windows-API
Im Folgenden finden Sie nützliche Funktionen, mit denen Windows erkannt und ein benutzerdefinierter Handler für Ctrl+ Cin der Konsole installiert werden kann :
Sie können oben wie folgt verwenden:
Lösung 3: Abfragemethode
Ich bevorzuge oder empfehle diese Methode nicht, da sie unnötigerweise Prozessor verbraucht und die Leistung negativ beeinflusst.
Import Threading Importzeit
quelle
ctrl + c
nicht beendet, sondern angezeigtKeyboardInterrupt
.Drücken Sie auf dem Mac Ctrl+ \, um einen an ein Terminal angeschlossenen Python-Prozess zu beenden.
quelle
Auf einem Mac / in Terminal:
quelle
Die können helfen.
quelle
Sie können Ihren Task-Manager öffnen (Strg + Alt + Löschen, dann zum Task-Manager gehen) und ihn nach Python durchsuchen. Der Server heißt (für das Beispiel) _go_app (Namenskonvention lautet: _language_app).
Wenn ich die Aufgabe _go_app beende, wird der Server beendet. Wenn Sie also im Browser dorthin gehen, wird "unerwartet beendet" angezeigt. Ich verwende auch git bash. Wenn ich einen Server starte, kann ich den Server in der bash-Shell nicht ausbrechen mit Strg + C oder Strg + Pause, aber sobald Sie die Python-Aufgabe beenden (die mit 63,7 MB), bricht sie in Bash aus dem Serverskript aus und erlaubt mir, die Git-Bash-Shell zu verwenden.
quelle
Für die Aufzeichnung war das, was den Prozess auf meinem Raspberry 3B + (mit raspbian) beendet hat, Ctrl+ '. Auf meiner französischen AZERTY-Tastatur ist die Berührung 'auch Nummer 4.
quelle