[python] 키 입력으로 while 루프를 종료하는 방법은 무엇입니까?

직렬 데이터를 읽고 while 루프를 사용하여 csv 파일에 쓰고 있습니다. 사용자가 충분한 데이터를 수집했다고 느끼면 while 루프를 종료 할 수 있기를 바랍니다.

while True:
    #do a bunch of serial stuff

    #if the user presses the 'esc' or 'return' key:
        break

나는 opencv를 사용하여 이와 같은 일을했지만이 응용 프로그램에서 작동하지 않는 것 같습니다 (그리고 어쨌든이 기능을 위해 opencv를 가져오고 싶지 않습니다) …

        # Listen for ESC or ENTER key
        c = cv.WaitKey(7) % 0x100
        if c == 27 or c == 10:
            break

그래서. 사용자가 루프를 벗어나게하려면 어떻게해야합니까?

또한 while 루프가 종료 된 후에도 스크립트가 계속 실행되어야하므로 키보드 인터럽트를 사용하고 싶지 않습니다.



답변

가장 쉬운 방법은 일반적인 Ctrl-C(SIGINT)로 중단하는 것입니다 .

try:
    while True:
        do_something()
except KeyboardInterrupt:
    pass

이후 Ctrl-C원인이 KeyboardInterrupt제기 될 단지 루프 밖에서 그것을 잡을 그것을 무시한다.


답변

비표준 모듈이 필요하지 않고 100 % 운송 가능한 솔루션이 있습니다.

import thread

def input_thread(a_list):
    raw_input()
    a_list.append(True)

def do_stuff():
    a_list = []
    thread.start_new_thread(input_thread, (a_list,))
    while not a_list:
        stuff()


답변

다음 코드가 나를 위해 작동합니다. openCV (cv2 가져 오기)가 필요합니다.

코드는 누른 키를 지속적으로 찾는 무한 루프로 구성됩니다. 이 경우 ‘q’키를 누르면 프로그램이 종료됩니다. 다른 키 (이 예에서는 ‘b’또는 ‘k’)를 눌러 변수 값 변경 또는 기능 실행과 같은 다른 작업을 수행 할 수 있습니다.

import cv2

while True:
    k = cv2.waitKey(1) & 0xFF
    # press 'q' to exit
    if k == ord('q'):
        break
    elif k == ord('b'):
        # change a variable / do something ...
    elif k == ord('k'):
        # change a variable / do something ...


답변

Python 3.7의 경우 user297171의 멋진 답변을 복사하고 변경하여 테스트 한 Python 3.7의 모든 시나리오에서 작동합니다.

import threading as th

keep_going = True
def key_capture_thread():
    global keep_going
    input()
    keep_going = False

def do_stuff():
    th.Thread(target=key_capture_thread, args=(), name='key_capture_thread', daemon=True).start()
    while keep_going:
        print('still going...')

do_stuff()


답변

pyHook이 도움이 될 수 있습니다. http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

키보드 후크를 참조하십시오. 이것은보다 일반화되어 있습니다. KeyboardInterrupt를 사용하는 것이 아니라 특정 키보드 상호 작용을 원하는 경우입니다.

또한 일반적으로 (사용에 따라) Ctrl-C 옵션을 사용하여 스크립트를 종료하는 것이 합리적이라고 생각합니다.

이전 질문도 참조하십시오 : 눌린 키를 파이썬에서 감지 하십시오.


답변

항상 sys.exit()있습니다.

Python 핵심 라이브러리의 시스템 라이브러리에는 프로토 타이핑시 매우 편리한 종료 기능이 있습니다. 코드는 다음과 같습니다.

import sys

while True:
    selection = raw_input("U: Create User\nQ: Quit")
    if selection is "Q" or selection is "q":
        print("Quitting")
        sys.exit()
    if selection is "U" or selection is "u":
        print("User")
        #do_something()


답변

특정 키 (이 경우 이스케이프 키)로 스크립트를 끝내도록 rayzinnz의 답변을 수정했습니다.

import threading as th
import time
import keyboard

keep_going = True
def key_capture_thread():
    global keep_going
    a = keyboard.read_key()
    if a== "esc":
        keep_going = False


def do_stuff():
    th.Thread(target=key_capture_thread, args=(), name='key_capture_thread', daemon=True).start()
    i=0
    while keep_going:
        print('still going...')
        time.sleep(1)
        i=i+1
        print (i)
    print ("Schleife beendet")


do_stuff()