2009-09-01 18 views
78

Mam skrypt Pythona, który używa wątków i sprawia, że ​​wiele żądań HTTP. Wydaje mi się, że podczas odczytywania żądania HTTP (przy użyciu urllib2) blokuje się i nie odpowiada na to, aby zatrzymać program. Czy jest jakiś sposób obejścia tego?Zatrzymywanie python za pomocą ctrl + c

+7

Nie wiem dlaczego, ale przynajmniej na OS X, użycie Control + Backslash powoduje, że kończy się i pojawia się okno "python crashed" ... dziwne. Niezbyt użyteczne informacje, a więc jest to komentarz! – micmoo

+3

Właściwie to działa na wszystkich aplikacjach w Terminalu ... – micmoo

+0

David Beazley opisał, jak przerywanie Ctrl/C może przekształcić skrypt Python z wielowątkowym gwintem w procesor CPU. Jest to wzmiankowane tutaj (http://stackoverflow.com/questions/990102/python-global-interpreter-lock-gil-workaround-on-multi-core-systems-using-tasks) z linkiem do mowy Beazleya. –

Odpowiedz

104

W Windows, jedynym pewnym sposobem jest użycie CtrlPrzerwa. Zatrzymuje natychmiast każdy skrypt Pythona!

(Zauważ, że na niektórych klawiaturach, "Break" jest oznaczony jako "pause".)

+1

Działa, dziękuje – jonatron

+2

Co to jest "Przerwa"? Jak mogę to napisać? – u0b34a0f6ae

+5

Powinien być przycisk Pause_Break na klawiaturze – jonatron

35

Jeśli jest uruchomiony w zastosowaniu powłoki Python Ctrl + Z, inaczej proces python zlokalizować i zabić go.

+19

'^ Z' ->' [1] + Zatrzymano '->' kill% 1', aby zatrzymać zadanie nr 1 (lub zadanie% 1 tak, jak bash to ujmuje) – u0b34a0f6ae

+0

tak! Ctrl + Z działa dla mnie! –

+15

Warto dodać, że Ctrl + Z po prostu * wstrzymuje * proces. –

56

Naciśnięcie Ctrl + c podczas gdy program jest uruchomiony pyton spowoduje Pythona podnieść KeyboardInterupt wyjątek. Prawdopodobnie program, który wykonuje wiele żądań HTTP, będzie miał wiele kodów obsługi wyjątków. Jeśli poza blokiem try-except nie określono, które wyjątki powinny zostać przechwycone, przechwyci wszystkie wyjątki, w tym właśnie wywołany KeyboardInterupt. Odpowiednio zakodowany program python będzie korzystał z python exception hierarchy i wychwyci wyjątki, które pochodzą z wyjątku.

#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 KeyboardInterupt 

Jeśli nie można zmienić kod (lub trzeba zabić program tak, że zmiany wejdą w życie), to można spróbować nacisnąć Ctrl + c szybko. Pierwszy z wyjątków KeyboardInterupt wybije twój program z bloku try i mam nadzieję, że jeden z późniejszych wyjątków KeyboardInterrupt zostanie podniesiony, gdy program znajdzie się poza blokiem try.

+0

To jest świetna odpowiedź, aby umożliwić najczęściej spotykany "break" czyli ctrl + c. – Xerion

22

Proces przerwań zależy od sprzętu i systemu operacyjnego. Będziesz miał bardzo różne zachowanie w zależności od tego, gdzie uruchamiasz skrypt Pythona. Na przykład na komputerach z systemem Windows mamy Ctrl + C (SIGINT) i Ctrl + Przerwa (SIGBREAK).

Więc gdy SIGINT jest obecny we wszystkich systemach i mogą być obsługiwane i złapać sygnał SIGBREAK Windows specyficzny (i może zostać wyłączony w CONFIG.SYS) i jest naprawdę obsługiwane przez BIOS jako wektorów przerwań INT 1Bh, dlatego ten klucz jest znacznie potężniejszy niż jakikolwiek inny. Więc jeśli używasz jakiegoś systemu operacyjnego o smaku * nix, otrzymasz różne wyniki w zależności od implementacji, ponieważ ten sygnał nie jest obecny, ale inne są. W Linuksie można sprawdzić jakie są sygnały do ​​Państwa dyspozycji przez:

$ 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 

więc jeśli chcesz złapać CTRL+BREAKsignal w systemie Linux będziesz musiał sprawdzić, co POSIX signal one odwzorowane ten klucz.Najczęściej są mapowania:

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

W rzeczywistości, wiele więcej funkcji są dostępne pod Linuksem, gdzie klawisz SysRq (Request System) może przyjmować a life of its own ...

11

Ten post jest stary, ale ja niedawno wpadł na ten sam problem z CTRL+C, nie kończąc skryptów Pythona na moim Linux. Użyłem CTRL + \ (SIGQUIT).

+0

Dziękuję! Zwięzły. –

+0

Chociaż spowoduje to zrzut rdzenia, ale zatrzyma skrypt, dzięki – ospider

0

na Mac/w Terminalu:

  1. Pokaż Inspector (kliknij prawym przyciskiem myszy w oknie terminala lub Shell> Pokaż Inspektora)
  2. kliknij ikonę Ustawienia powyżej "Uruchamianie procesu"
  3. wybrać z lista opcji w "Grupa procesów sygnałowych" (zabijanie, kończenie, przerywanie itd.).
-1

Ctrl + q natychmiast zatrzyma uruchomiony kod i zamknie wszystkie okna.

1

na prasach Mac:

"kontrola" + "\"

aby zamknąć proces Pythona dołączony do terminalu.

Powiązane problemy