Ctrl + C를 사용하여 파이썬 중지
스레드를 사용하고 많은 HTTP 요청을하는 파이썬 스크립트가 있습니다. 나는 urllib2를 사용하는 HTTP 요청을 읽는 CtrlC동안 프로그램을 중지 하기 위해 차단하고 응답하지 않는다고 생각 합니다. 이 주위에 어떤 방법이 있습니까?
Windows에서 유일한 확실한 방법은을 사용하는 것 CtrlBreak입니다. 모든 파이썬 스크립트를 즉시 중지합니다!
(일부 키보드에서 "브레이크"는 "일시 정지"로 표시되어 있습니다.)
파이썬 프로그램이 실행되는 동안 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
Python 스크립트를 종료하지 않는 것과 동일한 문제가 발생했습니다 Linux
. CTRL + \
( SIGQUIT
)를 사용했습니다 .
Windows 및 Linux의 Ctrl + C 차이점
Python 3.6부터 인터프리터는 Linux 및 Windows에서 Ctrl + C로 생성 된 SIGINT를 다르게 처리합니다. Linux의 경우 ctrl + c는 대부분 예상대로 작동 하지만 Windows에서는 ctrl + c 가 웹 응답 과 같은 호출이 차단 되거나 대기하는 경우에는 대부분 작동하지 않습니다 thread.join
( time.sleep
그러나 작동합니다 ). 다음 은 파이썬 인터프리터에서 무슨 일이 일어나고 있는지에 대한 좋은 설명 입니다.
Solution 1: Use Ctrl+Break or Equivalent
Use below keyboard shortcuts in terminal/console window which will generate SIGBREAK at lower level in OS and terminate the Python interpreter.
Mac OS and Linux
Ctrl + Shift + \ or
Ctrl + \
Windows:
- General:
Ctrl+Break
- Dell:
Ctrl+Fn+F6
orCtrl+Fn+S
- Lenovo:
Ctrl+Fn+F11
orCtrl+Fn+B
- HP:
Ctrl+Fn+Shift
- Samsung:
Fn+Esc
Solution 2: Use Windows API
Below are handy functions which will detect Windows and install custom handler for Ctrl+C in console:
#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)
You can use above like this:
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!
Solution 3: Polling method
I don't prefer or recommend this method because it unnecessarily consumes processor and power negatively impacting the performance.
import threading import time
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
On Mac press:
"control" + " \ "
to quit a python process attached to a terminal.
On a mac / in Terminal:
- Show Inspector (right click within the terminal window or Shell >Show Inspector)
- click the Settings icon above "running processes"
- choose from the list of options under "Signal Process Group" (Kill, terminate, interrupt, etc).
- Forcing the program to close using Alt+F4 (shuts down current program)
- Spamming the X button on CMD for e.x.
- Taskmanager (first Windows+R and then "taskmgr") and then end the task.
Those may help.
For the record, what killed the process on my Raspberry 3B+ (running raspbian) was:
CTRL + '
On my French AZERTY keyboard, the touch ' is also number 4.
You can open your task manager (ctrl + alt + delete, then go to task manager) and look through it for python and the server is called (for the example) _go_app (naming convention is: _language_app).
If I end the _go_app task it'll end the server, so going there in the browser will say it "unexpectedly ended", I also use git bash, and when I start a server, I cannot break out of the server in bash's shell with ctrl + c or ctrl + pause, but once you end the python task (the one using 63.7 mb) it'll break out of the server script in bash, and allow me to use the git bash shell.
참고URL : https://stackoverflow.com/questions/1364173/stopping-python-using-ctrlc
'program story' 카테고리의 다른 글
Jenkins Git 플러그인 : 특정 태그를 작성하는 방법? (0) | 2020.07.24 |
---|---|
Homebrew 오류에서 설치 (0) | 2020.07.24 |
Visual Studio 프로젝트의 종속성 그래프 (0) | 2020.07.24 |
INSTALL_FAILED_USER_RESTRICTED : Redmi 4 장치를 사용하는 Android 스튜디오 (0) | 2020.07.24 |
개발을 위해 도메인 이름에 대한 자체 서명 인증서를 작성하는 방법은 무엇입니까? (0) | 2020.07.24 |