Stoppen von Python mit Strg + C.


128

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?


9
Ich weiß nicht warum, aber zumindest unter OS X führt die Verwendung von Strg + Backslash dazu, dass es beendet wird und Sie einen "Python-Absturz" -Dialog erhalten ... seltsam. Nicht wirklich so nützliche Infos, also ist es ein Kommentar!
Micmoo

3
Eigentlich funktioniert es auf allen Anwendungen im Terminal ...
micmoo

1
David Beazley hat beschrieben, wie ein Strg / C-Interrupt ein Python-Skript mit mehreren Threads in ein CPU-Problem verwandeln kann. Es wird hier ( stackoverflow.com/questions/990102/… ) mit einem Link zu Beazleys Vortrag angesprochen .
Ned Deily

Antworten:


189

Unter Windows ist die Verwendung nur sicher CtrlBreak. Stoppt jedes Python-Skript sofort!

(Beachten Sie, dass auf einigen Tastaturen "Pause" als "Pause" gekennzeichnet ist.)


4
Was ist Break? Wie schreibe ich es?
u0b34a0f6ae

5
Es sollte eine Pause_Break-Taste auf Ihrer Tastatur sein
Jonatron

18
Was ist, wenn es keine gibt? Ich bin auf einem Intel Macbook und es hat keine sehr voll ausgestattete Tastatur.
Bluu

53
Unter Linux sollten Sie Strg-Umschalt- \
Michał Zieliński

12
Strg + Z beendet das Skript nicht, sondern versteckt es nur im Hintergrund und setzt es aus. Sie können fg eingeben, um es abzurufen.
Shady Xu

84

Wenn Sie Ctrl+ drücken, cwährend ein Python-Programm ausgeführt wird, löst Python eine KeyboardInterruptAusnahme aus. Es ist wahrscheinlich, dass ein Programm, das viele HTTP-Anforderungen stellt, viel Code für die Ausnahmebehandlung enthält. Wenn der exceptTeil des try- exceptBlock nicht angibt , welche Ausnahmen sollte es fangen, werden alle Ausnahmen , darunter fangen die , KeyboardInterruptdass Sie gerade verursacht. Ein ordnungsgemäß codiertes Python-Programm verwendet die Python-Ausnahmehierarchie und fängt nur Ausnahmen ab, von denen abgeleitet wird Exception.

#This is the wrong way to do things
try:
  #Some stuff might raise an IO exception
except:
  #Code that ignores errors

#This is the right way to do things
try:
  #Some stuff might raise an IO exception
except Exception:
  #This won't catch KeyboardInterrupt

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 KeyboardInterruptAusnahmen wird Ihr Programm aus dem tryBlock werfen und hoffentlich wird eine der späteren KeyboardInterruptAusnahmen ausgelöst, wenn sich das Programm außerhalb eines tryBlocks befindet.


1
Dies ist eine großartige Antwort, um die häufigste "Unterbrechung" zu aktivieren, nämlich Strg + C.
Xerion

53

Wenn es in der Python-Shell ausgeführt wird, verwenden Sie Ctrl+ Z, andernfalls suchen Sie den pythonProzess und beenden Sie ihn.


25
^Z-> [1]+ Stopped -> kill %1um Job # 1 zu stoppen (oder Job% 1, wie Bash es ausdrückt)
u0b34a0f6ae

23
Es lohnt sich, der Antwort hinzuzufügen, dass Strg + Z den Vorgang nur anhält .
Matteo Italia

2
Um das oben Genannte näher zu erläutern: Wenn Sie den Prozess anhalten, bleibt er im Speicher und in Ihrer Shell, und verhindert lediglich, dass CPU-Ressourcen verwendet werden. Dateien, Sockets, alles ist noch offen und in Gebrauch. Tatsächlich fgbringt das Tippen es gleich zurück.
RandomInsano

2
Ctrl+ZDies ist nicht der richtige Weg, um ein Python-Skript zu stoppen, und sollte vermieden werden, es sei denn, Sie planen, den angehaltenen Prozess fortzusetzen.
Josh Correia

33

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:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGEMT       8) SIGFPE       9) SIGKILL     10) SIGBUS
11) SIGSEGV     12) SIGSYS      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGURG      17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGPWR      30) SIGUSR1
31) SIGUSR2     32) SIGRTMAX

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:

CTRL+\     = SIGQUIT 
CTRL+D     = SIGQUIT
CTRL+C     = SIGINT
CTRL+Z     = SIGTSTOP 
CTRL+BREAK = SIGKILL or SIGTERM or SIGSTOP

Tatsächlich stehen unter Linux viel mehr Funktionen zur Verfügung, bei denen der SysRqSchlüssel (Systemanforderung) ein Eigenleben annehmen kann ...


19

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.


Es wird zwar einen Core Dump verursachen, aber es hat das Skript
gestoppt

17

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.jointime.sleepCtrlCSIGINT

Lösung 1: Verwenden Sie Ctrl+ Breakoder Äquivalent

Verwenden Sie die folgenden Tastenkombinationen im Terminal- / Konsolenfenster, die SIGBREAKim Betriebssystem auf einer niedrigeren Ebene generiert werden, und beenden Sie den Python-Interpreter.

Mac OS und Linux

Ctrl+ Shift+ \oder Ctrl+\

Windows :

  • Allgemein: Ctrl+Break
  • Dell: Ctrl+ Fn+ F6oder Ctrl+ Fn+S
  • Lenovo: Ctrl+ Fn+ F11oder Ctrl+ Fn+B
  • HP: Ctrl+ Fn+Shift
  • Samsung: Fn+Esc

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 :

#win_ctrl_c.py

import sys

def handler(a,b=None):
    sys.exit(1)
def install_handler():
    if sys.platform == "win32":
        import win32api
        win32api.SetConsoleCtrlHandler(handler, True)

Sie können oben wie folgt verwenden:

import threading
import time
import win_ctrl_c

# do something that will block
def work():
    time.sleep(10000)        
t = threading.Thread(target=work)
t.daemon = True
t.start()

#install handler
install_handler()

# now block
t.join()

#Ctrl+C works now!

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

def work():
    time.sleep(10000)        
t = threading.Thread(target=work)
t.daemon = True
t.start()
while(True):
    t.join(0.1) #100ms ~ typical human response
# you will get KeyboardIntrupt exception

Nein, unter Ubuntu wird beim Drücken von Python 2.7 und 3.6 das Drücken ctrl + cnicht beendet, sondern angezeigt KeyboardInterrupt.
Rick

7

Drücken Sie auf dem Mac Ctrl+ \, um einen an ein Terminal angeschlossenen Python-Prozess zu beenden.


3

Auf einem Mac / in Terminal:

  1. Inspektor anzeigen (Rechtsklick im Terminalfenster oder Shell> Inspektor anzeigen)
  2. Klicken Sie auf das Symbol Einstellungen über "Ausführen von Prozessen".
  3. Wählen Sie aus der Liste der Optionen unter "Signalprozessgruppe" (Beenden, Beenden, Unterbrechen usw.).

1
  • Erzwingen, dass das Programm mit Alt + F4 geschlossen wird (aktuelles Programm wird heruntergefahren)
  • Spam die X-Taste auf CMD zum Beispiel
  • Taskmanager (zuerst Windows + R und dann "taskmgr") und beenden Sie die Task.

Die können helfen.


1

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. Geben Sie hier die Bildbeschreibung ein


1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.