파이썬이 키를 누를 때까지 어떻게 기다리나요?


답변:


543

에서 파이썬 3 를 사용 input():

input("Press Enter to continue...")

에서 파이썬이 사용 raw_input():

raw_input("Press Enter to continue...")

사용자가 Enter 키를 누를 때까지만 기다립니다.

msvcrt 를 사용하고 싶을 수도 있습니다 ((Windows / DOS에만 해당) msvcrt 모듈을 사용하면 Microsoft Visual C / C ++ 런타임 라이브러리 (MSVCRT)의 ​​여러 기능에 액세스 할 수 있습니다).

import msvcrt as m
def wait():
    m.getch()

키를 누를 때까지 기다려야합니다.

추가 정보:

파이썬 3 raw_input()에는 존재하지 않습니다

파이썬에서 2 input(prompt)에 해당eval(raw_input(prompt))


54
내가 파이썬 2.7에서이 작업을 수행 할 때이 오류 받고 있어요 : "구문 에러를 : 예기치 않은 EOF를 구문 분석하는 동안"
존 Tirsen

8
@ Solarsaturn9 및 증가하고 많은 수 없습니다. 따라서이 답변은 저에게 효과가 없었으며 여기에 오는 다른 많은 사람들에게는 효과가 없었습니다.
ctrl-alt-delor

5
input ()을 사용하는 @richard는 다른 플랫폼에서도 작동합니다. 첫 번째 솔루션이 다중 플랫폼 인 경우 대체 Windows 전용 솔루션을 제공하기 위해 포인트를 도킹하는 것은 어리 석습니다.
Cory Buckley

7
@ Solarsaturn9는 질문을 읽고 다시 대답합니다. input어떤 키를 눌러도 Enter 키를 눌러야 계속되지 않습니다.
ctrl-alt-delor

13
@JonTirsen은 Python 2.7에 입력 한 문자열을 평가하는 입력이라는 함수가 있기 때문입니다. 수정하려면 raw_input
Samy Bencherif를 사용하십시오.

316

Python 2에서이를 수행하는 한 가지 방법은 다음을 사용하는 것입니다 raw_input().

raw_input("Press Enter to continue...")

python3에서 그것은 단지 input()


17
여러 키 중 하나 일 수있는 경우는 어떻습니까? 뿐만 아니라 enter?
noio

33
Python 3+ 에서는 이것이로 변경되었습니다 input().
palswim

Py2 및 Py3 호환 코드에 6 개 사용 :from six.moves import input; input("Press Enter to continue...")
rcoup

56

내 리눅스 상자에서 다음 코드를 사용합니다. 이것은 다른 곳에서 보았던 코드와 비슷하지만 (예를 들어 오래된 파이썬 FAQ에서) 코드는이 코드가없는 단단한 루프에서 회전하고 코드가 이것을 설명하지 않는 이상한 코너 사례가 많이 있습니다. 코드는 않습니다.

def read_single_keypress():
    """Waits for a single keypress on stdin.

    This is a silly function to call if you need to do it a lot because it has
    to store stdin's current setup, setup stdin for reading single keystrokes
    then read the single keystroke then revert stdin back after reading the
    keystroke.

    Returns a tuple of characters of the key that was pressed - on Linux, 
    pressing keys like up arrow results in a sequence of characters. Returns 
    ('\x03',) on KeyboardInterrupt which can happen when a signal gets
    handled.

    """
    import termios, fcntl, sys, os
    fd = sys.stdin.fileno()
    # save old state
    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
    attrs_save = termios.tcgetattr(fd)
    # make raw - the way to do this comes from the termios(3) man page.
    attrs = list(attrs_save) # copy the stored version to update
    # iflag
    attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                  | termios.ISTRIP | termios.INLCR | termios. IGNCR
                  | termios.ICRNL | termios.IXON )
    # oflag
    attrs[1] &= ~termios.OPOST
    # cflag
    attrs[2] &= ~(termios.CSIZE | termios. PARENB)
    attrs[2] |= termios.CS8
    # lflag
    attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                  | termios.ISIG | termios.IEXTEN)
    termios.tcsetattr(fd, termios.TCSANOW, attrs)
    # turn off non-blocking
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
    # read a single keystroke
    ret = []
    try:
        ret.append(sys.stdin.read(1)) # returns a single character
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
        c = sys.stdin.read(1) # returns a single character
        while len(c) > 0:
            ret.append(c)
            c = sys.stdin.read(1)
    except KeyboardInterrupt:
        ret.append('\x03')
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return tuple(ret)

이것은 내가 여기에서 가장 좋아하는 대답이지만, 다른 사람들은 변화, 통제 등과 같은 것들을 잡지 못합니다.
Mala

1
순수한 파이썬에서는 거의 불가능한 @Mala; 아마도 C 모듈을 작성해야합니까?
고양이

시스템의 키보드 인터럽트 (Ctrl-C)에 "\ x03"이 표시됩니다.
GDR

1
ctrl-c는 ASCII 3이므로 예상됩니다. ctrl-c에서 신호를 올리려면 쉬운 해결책은 if ord (returned_value) == 3 : os.kill (os.getpid (), signal.SIGINT)를 넣는 것이지만 신호 처리를 끌 수도 있습니다 attrs [0] | = termios.BRKINT, attrs [3]! = termios.ISIG로 제외하고 KeyboardInterrupt 처리를 제거하십시오. 참고-쿼리를 고려하여 KeyboardInterrupt의 반환 값을 '\ x03'으로 변경했습니다 (이 코드는 항상 문자열을 반환 하기 때문에 ).
mheyman

"Page Up"또는 "Left Arrow"와 같은 복잡한 키 누름에 대한 튜플을 반환하도록 위의 코드를 어떻게 조정할 수 있습니까?
Derek

33

시스템 명령에 따라 괜찮다면 다음을 사용할 수 있습니다.

리눅스 :

import os
os.system('read -sn 1 -p "Press any key to continue..."')
print

윈도우 :

import os
os.system("pause")

신호가 발생할 때까지 계속 실행하려면 (예 : SIGINT) 반환 값을 확인한 system다음을 호출 할 수도 있습니다 sys.exit(0).
James Taylor

29

간단히 사용

input("Press Enter to continue...")

구문 분석하는 동안 SyntaxError : EOF가 예상됩니다.

간단한 수정 사용 :

try:
    input("Press enter to continue")
except SyntaxError:
    pass

5
input파이썬 2 에서는 사용하지 마십시오 raw_input. 올바른 기능은 입니다. 파이썬 2에서는와 input동일합니다 eval(raw_input()).
Blorgbeard는

2
이것은 사용자가 Enter 키를 누를 때까지 사용자가 누르는 모든 키를 무시합니다. 이는 OP가 요구하는 것과는 매우 다릅니다.
Jonathan Hartley

1
또한 '입력'을 사용하려는 경우 SyntaxError를 잡는 것이 적절하지 않습니다. 사용자 유형이 무엇이든 평가되므로, 예를 들어 "1/0"을 입력하면 SyntaxError 대신 ZeroDivisionError가 발생하고 프로그램이 종료됩니다.
Jonathan Hartley

@Blorgbeard가 언급했듯이 raw_input ( "계속하려면 Enter를 누르십시오 ...")을 사용하면 충분합니다. 디버깅 할 때 자주 사용합니다.
alltrue

15

파이썬 매뉴얼 은 다음을 제공합니다.

import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", repr(c)
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

유스 케이스에 넣을 수 있습니다.


12
연결이 끊어 지더라도 지식이 유지되도록 연결중인 항목을 복사하는 것이 좋습니다.
Richard

1
Python 3.x에서 어떻게 작동합니까? 3.x에서는 print 문을 호환 가능하게 변경 한 후 무한 반복되며 입력을 기다리지 않습니다. 그러나 파이썬 2에서는 훌륭하게 작동합니다.
고양이

링크가 다른 페이지로 리디렉션되도록 업데이트되었습니다. 새로운 링크가 여기 있습니다.
Matthias

15

크로스 플랫폼, Python 2/3 코드 :

# import sys, os

def wait_key():
    ''' Wait for a key press on the console and return it. '''
    result = None
    if os.name == 'nt':
        import msvcrt
        result = msvcrt.getch()
    else:
        import termios
        fd = sys.stdin.fileno()

        oldterm = termios.tcgetattr(fd)
        newattr = termios.tcgetattr(fd)
        newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
        termios.tcsetattr(fd, termios.TCSANOW, newattr)

        try:
            result = sys.stdin.read(1)
        except IOError:
            pass
        finally:
            termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)

    return result

fctl / non-blocking 항목을 제공했기 때문에 제거 IOError했지만 필요하지 않았습니다. 차단하기를 원하기 때문에이 코드를 사용하고 있습니다. ;)

추가:

나는 이것을 PyPI의 패키지에서 console 이라는 다른 많은 것들과 함께 구현했습니다 .

>>> from console.utils import wait_key

>>> wait_key()
'h'

1
오류가 발생했습니다 : 기기에 부적절한 ioctl '
Benoit

@Benoit 어떤 OS?
Gringo Suave

Linux-Ubuntu 20.04
Benoit

14

플랫폼 독립적 인 방법을 모르지만 Windows에서는 msvcrt 모듈을 사용하는 경우 getch 함수를 사용할 수 있습니다.

import msvcrt
c = msvcrt.getch()
print 'you entered', c

mscvcrt에는 비 차단 kbhit () 함수도 포함되어 대기하지 않고 키가 눌 렸는지 확인합니다 (해당 curses 함수가 있는지 확실하지 않음). UNIX에는 curses 패키지가 있지만 모든 화면 출력에 사용하지 않고 사용할 수 있는지 확실하지 않습니다. 이 코드는 UNIX에서 작동합니다.

import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()

curses.getch ()는 눌렀을 때와 동일한 출력을 갖도록 누른 키의 서수를 반환합니다.


저주를 사용하는 것은 큰 의존성이 관련되어 있더라도 매뉴얼에서 설명한 다소 복잡한 예제보다 훨씬 좋습니다. +1
Damian

4

입력을 기다리려면 (사용자가 키보드를 두드리면 의도하지 않은 일이 발생하지 않습니다) 사용

sys.stdin.readline()

2
요점은 사용자가 예를 들어 스페이스 바를 때릴 수 있도록 Enter 키만 누르지 않아도된다는 것입니다. 의도하지 않은 일이 발생하는 것을 피하기 위해 Enter를 요구하면 디자인이 잘못됩니다.
Synetech

3

나는 파이썬을 처음 접했고 이미 여기에서 만들어진 가장 간단한 제안을 재현하기에는 너무 바보라고 생각하고있었습니다. 그것은 알아야 할 함정이 있음이 밝혀졌습니다.

python-script가 IDLE에서 실행될 때 일부 IO 명령은 실제로는 터미널 창이 없으므로 완전히 다른 것처럼 보입니다.

예 : msvcrt.getch는 비 블로킹이며 항상 $ ff를 반환합니다. 이것은 이미 오래 전에보고 된 바 있습니다 (예 : https://bugs.python.org/issue9290 참조 )-수정 된 것으로 표시되어 있습니다. 어떻게 든 문제가 현재 버전의 python / IDLE에서 지속되는 것으로 보입니다.

따라서 위에 게시 된 코드 중 하나라도 작동하지 않으면 IDLE이 아닌 스크립트를 수동으로 실행하십시오. .


0

정확한 키를 눌렀는지 확인하려면 ( 'b'와 같이) 이렇게하십시오.

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break

8
이를 위해서는 사용자가 'b'(또는 다른 것)를 입력 한 다음 Enter 키를 눌러야합니다. 이는 OP가 요구하는 것과는 매우 다릅니다.
Jonathan Hartley

0

os.system은 항상 sh를 호출하는 것으로 보이며, 읽기에 대한 s 및 n 옵션을 인식하지 못합니다. 그러나 read 명령은 bash로 전달 될 수 있습니다.

 os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")

2
읽은 문서를 보면 -t 옵션을 지정하지 않으면 시간이 초과되지 않는다고 생각합니다.
제임스 킹
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.