sourcecode

ctrl+c를 사용하여 python 중지

copyscript 2023. 9. 11. 21:59
반응형

ctrl+c를 사용하여 python 중지

스레드를 사용하고 HTTP 요청을 많이 하는 파이썬 스크립트가 있습니다.urllib2를 사용하는 HTTP 요청이 읽히는 동안 차단되고 프로그램을 중지하기 위해 응답하지 않는 것이 발생하고 있다고 생각합니다.이 일을 해결할 방법이 없을까요?

윈도우에서는 모든 파이썬 스크립트를 즉시 중지합니다.

(일부 키보드에서 "Break"은 "Pause"로 표시됩니다.)

python 프로그램이 실행되는 동안 +를 누르면 python에서 예외가 발생합니다.HTTP 요청을 많이 하는 프로그램은 예외 처리 코드가 많을 가능성이 높습니다.만약에excepttry-except은 어떤 예외를 할지떤야지지다e다tlgkh떤n은지를야ltstt,h 블록은 다음을 포함한 모든 예외를 잡을 것입니다.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

코드를 변경할 수 없는 경우(또는 변경 사항을 적용하기 위해 프로그램을 종료해야 하는 경우)에는 +를 빠르게 눌러 볼 수 있습니다.그중 첫번째.KeyboardInterrupt예외들은 당신의 프로그램을 밖으로 떨어뜨릴 것입니다.try차단하고 바라건대 나중 중 하나가KeyboardInterrupt는이에을때fae 밖에 있을 때 제기됩니다.try막다른 골목

Python 셸에서 실행 중인 경우 +를 사용합니다. 그렇지 않으면python처리하고 죽입니다.

인터럽트 프로세스는 하드웨어와 OS에 의존합니다.따라서 python 스크립트를 실행하는 위치에 따라 동작이 매우 달라집니다.예를 들어, Windows 컴퓨터의 경우 + )가 있습니다.CSIGINT) Break및 + (SIGBREAK).

따라서 SIGINT는 모든 시스템에 존재하며 처리 및 포착이 가능하지만 SIGBREAK 신호는 Windows 특정 신호이며 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

그래서 만약 당신이 그를 잡으려면CTRL+BREAK 리눅스 시스템에서 어떤 POSIX 신호가 그 키를 매핑했는지 확인해야 합니다.인기 있는 매핑:

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

실제로 리눅스에서는 (시스템 요청) 키를 사용할 수 있는 더 많은 기능을 사용할 수 있습니다.

Ctrl+윈도와 리눅스의 Ctrl차이점D

파이썬 3.6부터는 리눅스와 윈도의 경우 파이썬 인터프리터가 +를 다르게 C처리하는 것으로 나타났습니다.Linux의 경우 C+는 대부분 예상대로 작동하지만 Windows에서는 +C 작동하지 않습니다. 특히 Python이 다음과 같은 통화 차단을 실행하고 있는 경우에는 +가 작동하지 않습니다.thread.join웹 응답을 기다리는 중입니다.그것은 효과가 있습니다.time.sleep,하지만.파이썬 인터프리터에서 무슨 일이 일어나고 있는지에 대한 멋진 설명이 있습니다.+ 가 생성됩니다.CSIGINT.

해결책 1: + 또는 동등한 것을 Break사용합니다.

생성할 터미널/콘솔 창에서 아래 키보드 단축키 사용SIGBREAKOS의 하위 레벨에서 Python 인터프리터를 종료합니다.

맥 OS와 리눅스

Ctrl+ShiftCtrl또는Shift\ +</kbd>

Windows:

  • 일반:Break +
  • 델: ++FnF6 또는 ++FnS
  • 레노버: FnF11++ 또는 ++FnB
  • HP: Ctrl+Fn+Shift
  • 삼성:Esc +

해결책 2: 윈도우 API 사용

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

#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: Polling 방법

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

    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

이 게시물은 오래되었지만 최근 리눅스에서 파이썬 스크립트를 종료하지 않는 +라는 C동일한 문제가 발생했습니다.+\ 를 사용했습니다.SIGQUIT).

Mac에서 +를 \눌러 단말기에 연결된 python 프로세스를 종료합니다.

를 합니다.KeyboardInterrupt됩니다.됨으로써 )ctrl+c로 출구를 내립니다.

from sys import exit

try:
    # Your code
    command = input('Type your command: ')

except KeyboardInterrupt:
    # User interrupt the program with ctrl+c
    exit()

Mac에서 / 터미널에서:

  1. Show Inspector (단말기 창 내에서 마우스 오른쪽 버튼 클릭 또는 Shell > Show Inspector)
  2. "running processes(프로세스 실행)" 위의 설정 아이콘을 클릭합니다.
  3. "Signal Process Group"의 옵션 목록(Kill, terminate, interrupt 등)에서 선택합니다.
  • Alt+F4를 사용하여 프로그램 강제 종료(현재 프로그램 종료)
  • CMD의 X 버튼을 e.x용으로 스팸 발송.
  • 작업 관리자(처음에는 Windows+R, 그 다음에는 "taskmgr")를 실행한 다음 작업을 종료합니다.

그게 도움이 될 겁니다

작업 관리자(ctrl + alt + delete)를 열고 python을 검색하면 서버가 _go_app(이름 지정 규칙은 _language_app)입니다.

_go_app 태스크를 종료하면 서버가 종료되므로 브라우저에서 실행하면 "예기치 않게 종료"라고 표시되고 git bash도 사용하며 서버를 시작할 때 ctrl + c 또는 ctrl + pause로 bash의 셸에 있는 서버에서 벗어날 수 없지만 python 태스크(63.7 mb를 사용하는 태스크)를 종료하면 bash에서 서버 스크립트에서 벗어날 수 있습니다.깃배시 껍질을 사용할 수 있게 해주세요enter image description here

참고로, Raspberry 3B+(running raspbian)에서 프로세스를 중단시킨 것은 +'였습니다.제 프랑스어 AZERTY 키보드에서도 터치는 4번입니다.

Mac에서는 이전의 +c를 사용합니다.참고: Ctrl 키이지 Command 또는 Option 키가 아닙니다.

언급URL : https://stackoverflow.com/questions/1364173/stopping-python-using-ctrlc

반응형