program story

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

inputbox 2020. 7. 24. 20:50
반응형

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


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


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

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


파이썬 프로그램이 실행되는 동안 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블록 외부에있을 때 이후의 예외 중 하나가 발생하기를 바랍니다 .


파이썬 쉘에서 실행 중이면 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+CPython 스크립트를 종료하지 않는 것과 동일한 문제가 발생했습니다 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 or Ctrl+Fn+S
  • Lenovo: Ctrl+Fn+F11 or Ctrl+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:

  1. Show Inspector (right click within the terminal window or Shell >Show Inspector)
  2. click the Settings icon above "running processes"
  3. 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. enter image description here

참고URL : https://stackoverflow.com/questions/1364173/stopping-python-using-ctrlc

반응형