मैं एक दबाए गए कुंजी के लिए अजगर का इंतजार कैसे करूं?


570

मैं चाहता हूं कि मेरी स्क्रिप्ट प्रतीक्षा करें जब तक कि उपयोगकर्ता किसी भी कुंजी को दबाए नहीं।

मैं उसको कैसे करू?

जवाबों:


542

में अजगर 3 उपयोग input():

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

में अजगर 2 उपयोग raw_input():

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

यह केवल उपयोगकर्ता के लिए हालांकि एंटर प्रेस करने की प्रतीक्षा करता है।

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 में ऐसा करने की कोशिश कर रहा हूं, तो मुझे यह त्रुटि मिल रही है: "सिंटैक्सएर्रर: अप्रत्याशित
ईओएफ

8
@ Solarsaturn9 और एक बढ़ती और बड़ी संख्या नहीं है। इस प्रकार यह उत्तर मेरे काम नहीं आया, और कई अन्य जो यहां आते हैं।
ctrl-alt-delor

5
इनपुट () का उपयोग करके @richard अन्य प्लेटफार्मों पर भी काम करना चाहिए। पहला समाधान मल्टी-प्लेटफ़ॉर्म होने पर वैकल्पिक विंडोज केवल समाधान प्रदान करने के लिए डॉक पॉइंट्स के लिए यह हास्यास्पद है।
कॉरी बकले

7
@ Solarsaturn9 ने प्रश्न और उत्तर को फिर से पढ़ा: inputजारी नहीं रखा जाता है यदि कोई कुंजी दबाया जाता है, केवल दर्ज करने पर दबाया जाता है।
ctrl-alt-delor

13
@JonTirsen ऐसा इसलिए है क्योंकि पायथन 2.7 में एक फ़ंक्शन है जिसे इनपुट कहा जाता है जो आपके द्वारा स्ट्रिंग का मूल्यांकन करता है। ठीक करने के लिए, कच्चे_इनपुट का उपयोग करें
सामी

316

पायथन 2 में ऐसा करने का एक तरीका, उपयोग करना है raw_input():

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

Python3 में यह सिर्फ है input()


17
इसके बारे में क्या जब यह कई चाबियों में से एक हो सकता है? सिर्फ नहीं enter?
noio

33
पायथन 3+ के साथ , यह सिर्फ बदल गया है input()
पालसीम

का उपयोग करते हुए Py2 & Py3 संगत कोड के लिए छह :from six.moves import input; input("Press Enter to continue...")
rcoup

56

मेरे लिनक्स बॉक्स पर, मैं निम्नलिखित कोड का उपयोग करता हूं। यह उस कोड के समान है जिसे मैंने कहीं और देखा है (उदाहरण के लिए पुराने अजगर FAQs में), लेकिन यह कोड एक तंग लूप में घूमता है, जहां यह कोड नहीं होता है और कई विषम कोने मामले होते हैं जो कोड उस के लिए खाता नहीं है कोड करता है।

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)

हालांकि यह मेरे उत्तरों का पसंदीदा है, जैसे अन्य लोग शिफ्ट, नियंत्रण आदि जैसी चीजों को नहीं पकड़ते हैं
माला

1
@ शुद्ध पाइथन में बहुत अधिक संभव नहीं है; शायद आपको C मॉड्यूल लिखना चाहिए?
बिल्ली

मुझे अपने सिस्टम पर कीबोर्ड इंटरप्ट (Ctrl-C) पर "\ x03" मिल रहा है।
जीडीआर

1
ctrl-c एक ascii 3 है जिससे कि उम्मीद की जाती है। यदि आप ctrl-c पर एक संकेत उठाना चाहते हैं, तो आसान उपाय यह है कि यदि एक ord (put_value) == 3: os.kill (os.getpid (), signal.SIGINT) लगाया जाए, लेकिन आप सिग्नल प्रोसेसिंग भी चालू कर सकते हैं द्वारा attrs [0] | = termios.BRKINT, attrs [3]! = termios.ISIG, और KeyboardInterrupt प्रसंस्करण को छोड़कर छुटकारा पाएं। नोट - मैंने आपकी क्वेरी के सम्मान में KeyboardInterrupt के एक '\ x03' में वापसी मान को बदल दिया (और क्योंकि यह कोड हमेशा एक स्ट्रिंग लौटाता है)।
महायान

उपरोक्त कोड को कैसे समायोजित किया जा सकता है ताकि यह "पेज अप" या "लेफ्ट एरो" जैसे जटिल कुंजी प्रेस के लिए एक टपल लौटे?
डेरेक

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)
जेम्स टेलर

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
यह उपयोगकर्ता की सभी कुंजी को अनदेखा करता है, जब तक कि वे हिट नहीं करते हैं, जो ओपी से पूछ रहा है, उससे काफी अलग है।
जोनाथन हार्टले

1
इसके अलावा, यदि आप 'इनपुट' का उपयोग करने जा रहे हैं, तो SyntaxError को पकड़ना उचित नहीं है। जो भी उपयोगकर्ता प्रकारों का मूल्यांकन किया जाता है, इसलिए यदि, उदाहरण के लिए, वे "1/0" टाइप करते हैं, तो एक सिंटेक्सएयर के बजाय एक ZeroDivisionError उठाया जाता है, और आपका प्रोग्राम बाहर निकल जाएगा।
जोनाथन हार्टले

जैसा कि @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
आपके द्वारा लिंक की जा रही चीज़ को कॉपी करने के लिए यह अच्छा अभ्यास है ताकि ज्ञान बना रहे, भले ही लिंक मर जाए (और वे करते हैं!)।
रिचर्ड

1
मैं पायथन 3.x में यह काम कैसे कर सकता हूं? 3.x में, प्रिंट स्टेटमेंट को कम्पेटिबल बनाने के लिए बदलने के बाद, यह अनंत रूप से लूप करता है और इनपुट की प्रतीक्षा नहीं करता है। हालांकि, यह पायथन 2 में बहुत अच्छा काम करता है।
बिल्ली

लिंक को किसी भिन्न पृष्ठ पर पुनर्निर्देशित किया गया है। नया लिंक यहाँ है
मथायस

15

क्रॉस प्लेटफ़ॉर्म, पायथन 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 / गैर-अवरुद्ध सामान को हटा दिया क्योंकि यह IOErrorएस दे रहा था और मुझे इसकी आवश्यकता नहीं थी। मैं इस कोड का विशेष रूप से उपयोग कर रहा हूं क्योंकि मैं इसे ब्लॉक करना चाहता हूं। ;)

परिशिष्ट:

मैंने इसे PyPI पर एक पैकेज में लागू किया है, जिसमें कंसोल नामक कई अन्य उपहार हैं :

>>> from console.utils import wait_key

>>> wait_key()
'h'

1
मुझे त्रुटि मिली: डिवाइस के लिए अनुचित ioctl '
बेनोइट

@ कौन से ओएस?
ग्रिंगो सुवे

14

मैं इसे करने के लिए एक स्वतंत्र मंच के बारे में नहीं जानता, लेकिन विंडोज के तहत, यदि आप msvcrt मॉड्यूल का उपयोग करते हैं, तो आप इसका उपयोग कर सकते हैं:

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

mscvcrt में गैर-अवरुद्ध kbhit () फ़ंक्शन भी शामिल है, यह देखने के लिए कि क्या प्रतीक्षा के बिना एक कुंजी दबाया गया था (यह सुनिश्चित नहीं होता है कि क्या संबंधित शाप फ़ंक्शन है)। UNIX के तहत, शाप पैकेज है, लेकिन यह सुनिश्चित नहीं है कि आप इसे स्क्रीन आउटपुट के सभी के लिए उपयोग किए बिना उपयोग कर सकते हैं। यह कोड UNIX के तहत काम करता है:

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

ध्यान दें कि शाप।गेट () कुंजी के क्रमिक रिटर्न को दबाया जाता है ताकि यह वही आउटपुट हो जो मुझे इसे डालना था।


शाप का उपयोग करना मैनुअल द्वारा वर्णित बल्कि समझाए गए उदाहरणों की तुलना में बहुत अच्छा है, भले ही इसमें एक बड़ी निर्भरता शामिल हो। +1
डेमियन

4

यदि आप प्रवेश के लिए प्रतीक्षा करना चाहते हैं (ताकि कीबोर्ड खटखटाने वाला उपयोगकर्ता अनहोनी का कारण न बने) का उपयोग करें

sys.stdin.readline()

2
पूरा बिंदु उपयोगकर्ता के लिए केवल Enter कुंजी दबाने के लिए नहीं है, उदाहरण के लिए स्पेसबार को बस थप्पड़ करने में सक्षम होना चाहिए। यदि आपको ऐसा करने से बचने के लिए Enter की आवश्यकता है, तो यह खराब डिज़ाइन है।
सिनटेक

3

मैं अजगर के लिए नया हूं और मैं पहले से ही सोच रहा था कि मैं यहां किए गए सबसे सरल सुझावों को पुन: पेश करने के लिए बहुत बेवकूफ हूं। यह पता चला है, एक नुकसान होना चाहिए जिसे जानना चाहिए:

जब IDLE से एक अजगर-स्क्रिप्ट निष्पादित होती है, तो कुछ IO- कमांड पूरी तरह से अलग व्यवहार करते हैं (जैसा कि वास्तव में कोई टर्मिनल विंडो नहीं है)।

उदाहरण के लिए। msvcrt.getch गैर-अवरुद्ध है और हमेशा $ ff देता है। यह बहुत पहले ही रिपोर्ट किया जा चुका है (उदाहरण https://bugs.python.org/issue9290 देखें ) - और यह तय के रूप में चिह्नित है, किसी तरह समस्या अजगर / आईडीएल के वर्तमान संस्करणों में बनी रहती है।

इसलिए यदि ऊपर दिया गया कोई भी कोड आपके लिए काम नहीं करता है, तो स्क्रिप्ट को मैन्युअल रूप से चलाने का प्रयास करें, और आईडीएलई से नहीं


0

यदि आप यह देखना चाहते हैं कि क्या उन्होंने एक सटीक कुंजी दबाया है (जैसे 'बी' कहो) ऐसा करें:

while True:
    choice = raw_input("> ")

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

8
इसके लिए उपयोगकर्ता को 'b' (या कुछ और) टाइप करने की आवश्यकता होती है, फिर एंटर दबाएं, जो कि ओपी से जो पूछ रहा है, उससे काफी अलग है।
जोनाथन हार्टले

0

os.system हमेशा श को आह्वान करता प्रतीत होता है, जो पढ़ने के लिए s और n विकल्पों की पहचान नहीं करता है। हालाँकि वाचन कमांड को पास किया जा सकता है:

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

2
रीड डॉक्यूमेंटेशन मुझे लगता है कि जब तक आप -t विकल्प निर्दिष्ट नहीं करते, तब तक यह समाप्त नहीं होगा।
जेम्स किंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.