개발/Python

[파이썬] 키를 누를때까지 기다리는 방법

MinorMan 2023. 8. 11. 19:32
반응형

<질문>

사용자가 아무 키나 누를 때까지 Python 스크립트를 기다리게 하려면 어떻게 해야 합니까?


<답변1>

~ 안에파이썬 3, 사용input():

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

~ 안에파이썬 2, 사용raw_input():

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

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

Windows/DOS에서는 다음을 사용하고 싶을 수 있습니다.msvcrt. 그만큼msvcrt모듈은 Microsoft Visual C/C++ 런타임 라이브러리(MSVCRT)의 여러 기능에 대한 액세스를 제공합니다.

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

키 누름을 기다려야 합니다.

노트:

파이썬 3에서는raw_input()존재하지 않는다.
파이썬 2에서는input(prompt)에 해당합니다eval(raw_input(prompt)).


<답변2>

파이썬 3에서는 다음을 사용하십시오.input():

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

파이썬 2에서는 다음을 사용하십시오.raw_input():

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

<답변3>

내 Linux 상자에서 다음 코드를 사용합니다. 이것은 내가 다른 곳에서 본 코드와 비슷하지만(예를 들어 이전 Python 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)

<답변4>

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

from __future__ import print_function
import os
import platform

if platform.system() == "Windows":
    os.system("pause")
else:
    os.system("/bin/bash -c 'read -s -n 1 -p \"Press any key to continue...\"'")
    print()

Windows, Linux 및 Mac OS X에서 Python 2 및 3과 함께 작동하는 것으로 확인되었습니다.


<답변5>

간단히 사용

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

Python 2를 사용할 때 다음 오류가 발생합니다.

SyntaxError: 구문 분석 중 EOF가 예상됩니다.

Python 2와 Python 3 모두에서 작동하는 코드에 대한 간단한 수정은 다음을 사용하는 것입니다.

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

<답변6>

크로스 플랫폼, 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.getwch()
    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 항목을 제거했습니다.IOErrors 그리고 나는 그것을 필요로 하지 않았다. 특히 이 코드를 차단하고 싶기 때문에 이 코드를 사용하고 있습니다. ;)

부록:

저는 이것을 PyPI의 패키지에서 다음과 같은 다른 많은 기능과 함께 구현했습니다.console:

>>> from console.utils import wait_key

>>> wait_key()
'h'

<답변7>

비단뱀manual다음을 제공합니다.

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)

사용 사례에 적용할 수 있습니다.


<답변8>

플랫폼 독립적인 방법을 모르지만 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()누른 키의 서수를 반환하여 캐스팅해야 했던 것과 동일한 출력을 갖도록 합니다.


<답변9>

나는 파이썬을 처음 접했고 여기서 만든 가장 간단한 제안을 재현하기에는 내가 너무 어리석다고 이미 생각하고 있었습니다. 알고 있어야 할 함정이 있습니다.

Python 스크립트가 IDLE에서 실행될 때 일부 IO 명령은 완전히 다르게 작동하는 것처럼 보입니다(실제로 터미널 창이 없기 때문에).

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

따라서 위에 게시된 코드가 작동하지 않는 경우 스크립트를 수동으로 실행해 보십시오.유휴 상태가 아님.


<답변10>

입력을 기다리려면(사용자가 키보드를 두드려도 의도하지 않은 일이 발생하지 않도록) 다음을 사용하십시오.

sys.stdin.readline()

<답변11>

당신은 사용할 수 있습니다keyboard도서관:

import keyboard
keyboard.wait('space')
print('space was pressed, continuing...')

<답변12>

os.system항상 부르는 것 같다.sh, 읽기에 대한 s 및 n 옵션을 인식하지 못합니다. 그러나 읽기 명령은 bash에 전달할 수 있습니다.

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

<답변13>

그들이 정확한 키(예: 'b')를 눌렀는지 확인하려면 다음과 같이 하십시오.

while True:
    choice = raw_input("> ")

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