복붙노트

[PYTHON] try-except를 사용하지 않고 Python에서 keyboardinterrupt 캡처

PYTHON

try-except를 사용하지 않고 Python에서 keyboardinterrupt 캡처

try-except 문 안에 모든 코드를 넣지 않고 KeyboardInterrupt 이벤트를 캡처 할 수있는 방법이 있습니까?

사용자가 Ctrl + C를 누르면 추적없이 끝내고 싶습니다.

해결법

  1. ==============================

    1.예, 모듈 신호를 사용하여 인터럽트 처리기를 설치하고 threading.Event를 사용하여 영원히 기다릴 수 있습니다.

    예, 모듈 신호를 사용하여 인터럽트 처리기를 설치하고 threading.Event를 사용하여 영원히 기다릴 수 있습니다.

    import signal
    import sys
    import time
    
    def signal_handler(signal, frame):
        print('You pressed Ctrl+C!')
        sys.exit(0)
    
    signal.signal(signal.SIGINT, signal_handler)
    print('Press Ctrl+C')
    forever = threading.Event()
    forever.wait()
    
  2. ==============================

    2.추적 표시를 원하지 않으면 다음과 같이 코드를 작성하십시오.

    추적 표시를 원하지 않으면 다음과 같이 코드를 작성하십시오.

    ## all your app logic here
    def main():
       ## whatever your app does.
    
    
    if __name__ == "__main__":
       try:
          main()
       except KeyboardInterrupt:
          # do nothing here
          pass
    

    (예,이 질문에 직접 대답하지 않는다는 것을 알고 있지만 try / except 블록이 불쾌 할 필요가있는 이유는 분명하지 않습니다 - 어쩌면 OP에 덜 성가 시게 할 수 있습니다)

  3. ==============================

    3.자신 만의 시그널 핸들러를 설정하는 대신 context-manager를 사용하여 예외를 잡아 무시할 수 있습니다 :

    자신 만의 시그널 핸들러를 설정하는 대신 context-manager를 사용하여 예외를 잡아 무시할 수 있습니다 :

    >>> class CleanExit(object):
    ...     def __enter__(self):
    ...             return self
    ...     def __exit__(self, exc_type, exc_value, exc_tb):
    ...             if exc_type is KeyboardInterrupt:
    ...                     return True
    ...             return exc_type is None
    ... 
    >>> with CleanExit():
    ...     input()    #just to test it
    ... 
    >>>
    

    어떤 일이 일어나고 있는지 명시 적으로 언급하면서 try-except 블록을 제거합니다.

    또한 매번 시그널 핸들러를 다시 설정하거나 재설정 할 필요없이 코드의 일부분에서만 인터럽트를 무시할 수 있습니다.

  4. ==============================

    4.나는 이것이 낡은 질문이라는 것을 알고 있지만, 나는 여기에 먼저 와서 atexit 모듈을 발견했다. 필자는 크로스 플랫폼 트랙 레코드 또는 아직 해결되지 않은 전체 목록을 알지 못하지만, 지금까지 Linux에서 post-KeyboardInterrupt 정리를 처리하려고 할 때 정확히 찾고자했습니다. 문제를 접근하는 또 다른 방법을 포기하고 싶었습니다.

    나는 이것이 낡은 질문이라는 것을 알고 있지만, 나는 여기에 먼저 와서 atexit 모듈을 발견했다. 필자는 크로스 플랫폼 트랙 레코드 또는 아직 해결되지 않은 전체 목록을 알지 못하지만, 지금까지 Linux에서 post-KeyboardInterrupt 정리를 처리하려고 할 때 정확히 찾고자했습니다. 문제를 접근하는 또 다른 방법을 포기하고 싶었습니다.

    패브릭 작업의 컨텍스트에서 사후 출구 정리를하고 싶습니다. 따라서 try / except의 모든 것을 래핑하는 것은 나에게도 옵션이 아니 었습니다. 저는 atexit가 코드가 제어 흐름의 최상위 레벨에 있지 않은 상황에서 잘 맞는 것 같아요.

    atexit은 매우 유용하고 즉시 읽을 수 있습니다. 예를 들면 다음과 같습니다.

    import atexit
    
    def goodbye():
        print "You are now leaving the Python sector."
    
    atexit.register(goodbye)
    

    데코레이터로 사용할 수도 있습니다 (2.6의 경우,이 예제는 docs에서 가져온 것입니다).

    import atexit
    
    @atexit.register
    def goodbye():
        print "You are now leaving the Python sector."
    

    KeyboardInterrupt에만 특정 기능을 사용하려면이 질문에 대한 다른 사람의 대답이 아마도 좋습니다.

    그러나 atexit 모듈은 ~ 70 줄의 코드 일 뿐이며 예외를 다르게 처리하는 비슷한 버전을 만드는 것은 어렵지 않습니다. 예를 들어 예외를 콜백 함수에 인수로 전달하는 것입니다. (수정 된 버전을 보증하는 atexit의 제한 : 현재 exit- 콜백 함수가 예외를 알 수있는 방법을 생각할 수 없다. atexit 처리기가 예외를 catch하고 콜백을 호출 한 다음 그 예외를 추측합니다. 그러나 당신은 이것을 다르게 할 수 있습니다.)

    자세한 내용은 다음을 참조하십시오.

  5. ==============================

    5.시도하지 않고 KeyboardInterrupt에 대한 스택 추적을 인쇄하지 못하게 할 수 있습니다. ... except KeyboardInterrupt : sys.excepthook을 대체하여 pass (가장 확실하고 적절하게 "최상의"솔루션이지만 이미 알고 있고 다른 것을 요청했습니다.). 좋아하는 것

    시도하지 않고 KeyboardInterrupt에 대한 스택 추적을 인쇄하지 못하게 할 수 있습니다. ... except KeyboardInterrupt : sys.excepthook을 대체하여 pass (가장 확실하고 적절하게 "최상의"솔루션이지만 이미 알고 있고 다른 것을 요청했습니다.). 좋아하는 것

    def custom_excepthook(type, value, traceback):
        if type is KeyboardInterrupt:
            return # do nothing
        else:
            sys.__excepthook__(type, value, traceback)
    
  6. from https://stackoverflow.com/questions/4205317/capture-keyboardinterrupt-in-python-without-try-except by cc-by-sa and MIT license