직렬 데이터를 읽고 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()