Câu trả lời:
Trong Python 3 sử dụng input()
:
input("Press Enter to continue...")
Trong Python 2 sử dụng raw_input()
:
raw_input("Press Enter to continue...")
Điều này chỉ chờ người dùng nhấn enter mặc dù.
Người ta có thể muốn sử dụng msvcrt ((chỉ dành cho Windows / DOS) Mô-đun msvcrt cho phép bạn truy cập vào một số chức năng trong Thư viện thời gian chạy Microsoft Visual C / C ++ (MSVCRT)):
import msvcrt as m
def wait():
m.getch()
Điều này sẽ chờ cho một phím nhấn.
Thông tin bổ sung:
trong Python 3 raw_input()
không tồn tại
Trong Python 2 input(prompt)
tương đương vớieval(raw_input(prompt))
input
không tiếp tục nếu nhấn bất kỳ phím nào, chỉ khi nhấn phím Enter.
Một cách để làm điều này trong Python 2, là sử dụng raw_input()
:
raw_input("Press Enter to continue...")
Trong python3, nó chỉ input()
enter
?
input()
.
Trên hộp linux của tôi, tôi sử dụng mã sau đây. Mã này tương tự như mã tôi đã thấy ở nơi khác (ví dụ: trong Câu hỏi thường gặp về python cũ) nhưng mã đó quay vòng trong một vòng lặp chặt chẽ trong đó mã này không có và có rất nhiều trường hợp góc kỳ lạ mà mã không giải thích cho điều này mã nào.
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)
Nếu bạn ổn với tùy thuộc vào lệnh hệ thống, bạn có thể sử dụng như sau:
Linux:
import os
os.system('read -sn 1 -p "Press any key to continue..."')
print
Các cửa sổ:
import os
os.system("pause")
system
đó và sau đó gọi sys.exit(0)
.
Đơn giản chỉ cần sử dụng
input("Press Enter to continue...")
sẽ gây ra SyntaxError: EOF dự kiến trong khi phân tích cú pháp.
Sử dụng sửa chữa đơn giản:
try:
input("Press enter to continue")
except SyntaxError:
pass
input
trong python 2 - chức năng chính xác là raw_input
. Trong python 2, input
tương đương với eval(raw_input())
.
Hướng dẫn python cung cấp như sau:
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)
có thể được đưa vào trường hợp sử dụng của bạn.
Nền tảng chéo, mã 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
Tôi đã xóa các thứ fctl / không chặn bởi vì nó đang cho IOError
s và tôi không cần nó. Tôi đang sử dụng mã này đặc biệt bởi vì tôi muốn nó bị chặn. ;)
Phụ lục:
Tôi đã thực hiện điều này trong một gói trên PyPI với rất nhiều tính năng khác được gọi là console :
>>> from console.utils import wait_key
>>> wait_key()
'h'
Tôi không biết về cách thức hoạt động độc lập với nền tảng, nhưng trong Windows, nếu bạn sử dụng mô-đun msvcrt, bạn có thể sử dụng chức năng getch của nó:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
mscvcrt cũng bao gồm hàm kbhit () không chặn để xem nếu một phím được nhấn mà không cần chờ đợi (không chắc có chức năng nguyền rủa tương ứng không). Trong UNIX, có gói lời nguyền, nhưng không chắc bạn có thể sử dụng nó mà không sử dụng nó cho tất cả đầu ra màn hình hay không. Mã này hoạt động theo UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Lưu ý rằng curses.getch () trả về số thứ tự của phím được nhấn để làm cho nó có cùng một đầu ra tôi phải bỏ nó.
Nếu bạn muốn đợi nhập (để người dùng gõ bàn phím không gây ra sự cố ngoài ý muốn), hãy sử dụng
sys.stdin.readline()
Tôi chưa quen với python và tôi đã nghĩ rằng mình quá ngu ngốc khi sao chép những gợi ý đơn giản nhất được đưa ra ở đây. Hóa ra, có một cạm bẫy người ta nên biết:
Khi tập lệnh python được thực thi từ IDLE, một số lệnh IO dường như hoạt động hoàn toàn khác (vì thực tế không có cửa sổ đầu cuối).
Ví dụ. msvcrt.getch không chặn và luôn trả về $ ff. Điều này đã được báo cáo từ lâu (xem ví dụ: https://bugs.python.org/su9290 ) - và nó được đánh dấu là đã sửa, bằng cách nào đó, vấn đề dường như vẫn tồn tại trong các phiên bản hiện tại của python / IDLE.
Vì vậy, nếu bất kỳ mã nào được đăng ở trên không phù hợp với bạn, hãy thử chạy tập lệnh theo cách thủ công và KHÔNG từ IDLE .
Nếu bạn muốn xem liệu họ có nhấn một phím chính xác không (như nói 'b') Thực hiện việc này:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
os.system dường như luôn gọi sh, không nhận ra các tùy chọn s và n để đọc. Tuy nhiên, lệnh đọc có thể được truyền cho bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")