스레드를 사용하고 많은 HTTP 요청을하는 파이썬 스크립트가 있습니다. 나는 urllib2를 사용하는 HTTP 요청을 읽는 CtrlC동안 프로그램을 중지 하기 위해 차단하고 응답하지 않는다고 생각 합니다. 이 주위에 어떤 방법이 있습니까?
답변
Windows에서 유일한 확실한 방법은을 사용하는 것 CtrlBreak입니다. 모든 파이썬 스크립트를 즉시 중지합니다!
(일부 키보드에서 “Break”는 “일시 정지”로 표시되어 있습니다.)
답변
파이썬 프로그램이 실행되는 동안 Ctrl+ c를 누르면 파이썬에서 KeyboardInterrupt
예외 가 발생합니다. HTTP 요청을 많이 만드는 프로그램에는 예외 처리 코드가 많이있을 수 있습니다. – 블록 의 except
일부가 어떤 예외를 잡아야하는지 지정하지 않으면 방금 발생한 예외를 포함하여 모든 예외를 잡아 냅니다. 올바르게 코딩 된 파이썬 프로그램은 파이썬 예외 계층을 사용 하고에서 파생 된 예외 만 포착 합니다.try
except
KeyboardInterrupt
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
코드를 변경할 수 없거나 변경 사항이 적용되도록 프로그램을 종료해야하는 경우 Ctrl+를 c빠르게 눌러보십시오 . 첫 번째 KeyboardInterrupt
예외는 프로그램을 try
블록에서 KeyboardInterrupt
벗어나게하고 프로그램이 try
블록 외부에있을 때 이후의 예외 중 하나가 발생하기를 바랍니다 .
답변
파이썬 쉘에서 실행 중이면 Ctrl+를 사용 Z하고 그렇지 않으면 python
프로세스를 찾아서 종료하십시오 .
답변
인터럽트 프로세스는 하드웨어 및 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에서 더 많은 기능을 사용할 수 있습니다 .
답변
이 포스팅은 오래 그러나 나는 최근에 같은 문제로 실행 Ctrl+ C하지 리눅스에서 파이썬 스크립트를 종료. 나는 Ctrl+ \( SIGQUIT
)를 사용했습니다.
답변
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
답변
Mac에서 Ctrl+ \를 누르면 터미널에 연결된 파이썬 프로세스가 종료됩니다.