Ctrl + C를 사용하여 파이썬 중지


128

스레드를 사용하고 많은 HTTP 요청을하는 파이썬 스크립트가 있습니다. 나는 urllib2를 사용하는 HTTP 요청을 읽는 CtrlC동안 프로그램을 중지 하기 위해 차단하고 응답하지 않는다고 생각 합니다. 이 주위에 어떤 방법이 있습니까?


9
이유는 모르겠지만 적어도 OS X에서는 Control + 백 슬래시를 사용하면 종료되고 "파이썬 충돌"대화 상자가 나타납니다. 실제로 유용한 정보는 아니므로 주석입니다!
micmoo

3
실제로 그것은 터미널의 모든 응용 프로그램에서 작동합니다 ...
micmoo

1
David Beazley는 Ctrl / C 인터럽트가 다중 스레드 Python 스크립트를 CPU 호그로 전환하는 방법을 설명했습니다. Beazley의 강연에 대한 링크로 여기 ( stackoverflow.com/questions/990102/… )에 대해 다루었습니다 .
Ned Deily

답변:


189

Windows에서 유일한 확실한 방법은을 사용하는 것 CtrlBreak입니다. 모든 파이썬 스크립트를 즉시 중지합니다!

(일부 키보드에서 "Break"는 "일시 정지"로 표시되어 있습니다.)


4
무엇입니까 Break? 입력은 어떻게합니까?
u0b34a0f6ae

5
키보드의 Pause_Break 버튼이 있어야합니다
jonatron

18
없는 경우 어떻게합니까? 저는 Intel Macbook을 사용하고 있으며 모든 기능을 갖춘 키보드가 없습니다.
Bluu

53
Linux에서는 Ctrl-Shift- \를 사용해야합니다.
Michał Zieliński

12
ctrl + Z는 스크립트를 죽이지 않고 단지 배경에 숨기고 일시 중단합니다. fg를 입력하여 호출 할 수 있습니다.
Shady Xu

84

파이썬 프로그램이 실행되는 동안 Ctrl+ c를 누르면 파이썬에서 KeyboardInterrupt예외 가 발생합니다. HTTP 요청을 많이 만드는 프로그램에는 예외 처리 코드가 많이있을 수 있습니다. - 블록 의 except일부가 어떤 예외를 잡아야하는지 지정하지 않으면 방금 발생한 예외를 포함하여 모든 예외를 잡아 냅니다. 올바르게 코딩 된 파이썬 프로그램은 파이썬 예외 계층을 사용 하고에서 파생 된 예외 만 포착 합니다.tryexceptKeyboardInterruptException

#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

코드를 변경할 수 없거나 변경 사항이 적용되도록 프로그램을 종료해야하는 경우 Ctrl+를 c빠르게 눌러보십시오 . 첫 번째 KeyboardInterrupt예외는 프로그램을 try블록에서 KeyboardInterrupt벗어나게하고 프로그램이 try블록 외부에있을 때 이후의 예외 중 하나가 발생하기를 바랍니다 .


1
이것은 ctrl + c 인 가장 일반적인 "break"를 가능하게하는 훌륭한 해답입니다.
Xerion

53

파이썬 쉘에서 실행 중이면 Ctrl+를 사용 Z하고 그렇지 않으면 python프로세스를 찾아서 종료하십시오 .


25
^Z-> [1]+ Stopped -> kill %1(bash는 풋 그것으로 또는 작업 % 1) 정지 작업 # 1
u0b34a0f6ae

23
Ctrl + Z 는 프로세스를 일시 중지 한다는 대답에 가치 가 있습니다.
Matteo Italia

2
위의 내용을 자세히 설명하려면 프로세스를 일시 중지하면 메모리와 셸에서 프로세스가 유지되므로 CPU 리소스를 사용하지 못하게됩니다. 파일, 소켓, 모든 것이 여전히 열려 있고 사용 중입니다. 실제로 타이핑 fg하면 바로 되돌아옵니다.
RandomInsano

2
Ctrl+Zpython 스크립트를 중지하는 올바른 방법이 아니므로 일시 중지 된 프로세스를 재개 할 계획이 없으면 피해야합니다.
Josh Correia

33

인터럽트 프로세스는 하드웨어 및 OS에 따라 다릅니다. 따라서 파이썬 스크립트를 실행하는 위치에 따라 동작이 매우 다릅니다. 예를 들어, Windows 시스템에는 Ctrl+ C( SIGINT) 및 Ctrl+ Break( SIGBREAK)가 있습니다.

그래서 SIGINT 모든 시스템에 존재하고 처리 및 잡힐 수 있지만, SIGBREAK 신호는 윈도우 고유의 것입니다 (및 비활성화 할 수 CONFIG.SYS ) 정말 인터럽트 벡터로 BIOS에 의해 처리됩니다 INT있는 1Bh 왜이 키는, 다른 것보다 훨씬 강력합니다. 따라서 일부 * nix 맛 OS를 사용하는 경우 해당 신호가 존재하지 않지만 다른 신호가 있기 때문에 구현에 따라 다른 결과를 얻을 수 있습니다. Linux에서는 다음을 통해 사용 가능한 신호를 확인할 수 있습니다.

$ 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

따라서 Linux 시스템 에서 CTRL+BREAK 신호 를 포착하려면 해당 키를 매핑 한 POSIX 신호 를 확인 해야합니다. 인기있는 매핑은 다음과 같습니다.

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

실제로 SysRq(시스템 요청) 키가 자체의 수명을 차지할 수 있는 Linux에서 더 많은 기능을 사용할 수 있습니다 .


19

이 포스팅은 오래 그러나 나는 최근에 같은 문제로 실행 Ctrl+ C하지 리눅스에서 파이썬 스크립트를 종료. 나는 Ctrl+ \( SIGQUIT)를 사용했습니다.


비록 그것이 코어 덤프를 야기 할 것이지만, 스크립트를 중단
시켰습니다.

17

Ctrl+ DWindows 및 Linux의 차이점

파이썬 3.6부터 파이썬 인터프리터는 Linux와 Windows에서 Ctrl+를 C다르게 처리합니다 . Linux의 경우, Ctrl+ C일하는 것이 대부분 그러나 Windows에서 예상대로 Ctrl+ C 대부분 파이썬과 같은 호출을 차단 실행중인 경우 특히 작동하지 않습니다 thread.join또는 웹 응답에 대기. 그러나 그것은 효과가 있습니다 time.sleep. 다음 은 파이썬 인터프리터에서 무슨 일이 일어나고 있는지에 대한 좋은 설명 입니다. 참고 Ctrl+가 C생성 SIGINT.

해결 방법 1 : Ctrl+ Break또는 동등 사용

터미널 / 콘솔 창에서 아래 키보드 단축키를 사용 SIGBREAK하여 OS에서 더 낮은 레벨로 생성 하고 Python 인터프리터를 종료하십시오.

맥 OS와 리눅스

Ctrl+ Shift+ \또는 Ctrl+\

윈도우 :

  • 일반 : Ctrl+Break
  • Dell : Ctrl+ Fn+ F6또는 Ctrl+ Fn+S
  • Lenovo : Ctrl+ Fn+ F11또는 Ctrl+ Fn+B
  • HP : Ctrl+ Fn+Shift
  • 삼성 : Fn+Esc

해결 방법 2 : Windows API 사용

아래는 Windows를 감지 하고 콘솔 에 Ctrl+ C에 대한 사용자 정의 핸들러를 설치하는 편리한 기능입니다 .

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

위와 같이 사용할 수 있습니다 :

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!

솔루션 3 : 폴링 방법

필자는이 방법을 불필요하게 프로세서를 소비하고 성능에 부정적인 영향을 미치는 전원을 사용하기 때문에 선호하거나 권장하지 않습니다.

가져 오기 스레딩 가져 오기 시간

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

아니요, Ubuntu에서 python 2.7 및 3.6 모두에 대해을 누르면 ctrl + c종료되지 않고 표시 KeyboardInterrupt됩니다.
Rick

7

Mac에서 Ctrl+ \를 누르면 터미널에 연결된 파이썬 프로세스가 종료됩니다.


3

Mac에서 / 터미널에서 :

  1. 검사기 표시 (터미널 창 내에서 마우스 오른쪽 버튼을 클릭하거나 셸> 검사기 표시)
  2. "프로세스 실행 중"위의 설정 아이콘을 클릭하십시오.
  3. "신호 프로세스 그룹"(킬, 종료, 인터럽트 등) 아래의 옵션 목록에서 선택하십시오.

1
  • Alt + F4를 사용하여 프로그램을 강제로 종료 (현재 프로그램 종료)
  • ex에 대한 CMD의 X 버튼 스패밍
  • 작업 관리자 (먼저 Windows + R 및 "taskmgr")를 누른 다음 작업을 종료하십시오.

도움이 될 수 있습니다.


1

작업 관리자 (ctrl + alt + delete를 선택한 다음 작업 관리자로 이동)를 통해 파이썬을 찾아 서버를 _go_app (이름 지정 규칙 : _language_app)이라고합니다.

_go_app 작업을 종료하면 서버가 종료되므로 브라우저에서 "예기치 않게 종료되었다"고 말하고 git bash도 사용하며 서버를 시작할 때 bash의 쉘에서 서버를 벗어날 수 없습니다 ctrl + c 또는 ctrl + pause로 파이썬 작업 (63.7 mb를 사용하는 작업)을 끝내면 bash의 서버 스크립트가 중단되고 git bash 쉘을 사용할 수 있습니다. 여기에 이미지 설명을 입력하십시오


1

기록상, Raspberry 3B + (라즈 비안 실행)에서 프로세스를 종료 한 것은 Ctrl+ '입니다. 프랑스어 AZERTY 키보드에서 터치 '도 4입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.