আমি কীভাবে অজগরটিকে একটি চাপা কীটির জন্য অপেক্ষা করব?


570

আমি চাই আমার স্ক্রিপ্টটি অপেক্ষা করা উচিত যতক্ষণ না ব্যবহারকারী কোনও কী চাপবেন।

আমি কেমন করে ঐটি করি?

উত্তর:


542

ইন পাইথন 3 ব্যবহার input():

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

ইন পাইথন 2 ব্যবহার raw_input():

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

এটি কেবল ব্যবহারকারী যদিও এন্টার টিপবে তার জন্য অপেক্ষা করে।

কেউ এমএসভিসিআরটি ব্যবহার করতে চাইতে পারে (শুধুমাত্র উইন্ডোজ / ডস) এমএসভিসিআরটি মডিউল আপনাকে মাইক্রোসফ্ট ভিজ্যুয়াল সি / সি ++ রানটাইম লাইব্রেরি (এমএসভিসিআরটি) এর বেশ কয়েকটি ফাংশনে অ্যাক্সেস দেয়:

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

এটি একটি কী প্রেসের জন্য অপেক্ষা করা উচিত।

অতিরিক্ত তথ্য:

পাইথন 3 তে raw_input()বিদ্যমান নেই

পাইথন 2 input(prompt)এর সমতুল্যeval(raw_input(prompt))


54
পাইথন ২.7-এ যখন আমি এটি করার চেষ্টা করছিলাম তখন আমি এই ত্রুটিটি পাচ্ছি: "
সিনট্যাক্স এরর:

8
@ সোলারস্যাটর্ন ৯ এবং ক্রমবর্ধমান এবং বিপুল সংখ্যক এটি ব্যবহার করে না। এই উত্তরটি আমার পক্ষে কার্যকর হয় নি, এবং অন্যান্য যে এখানে আসে।
ctrl-alt-delor

5
@richard ইনপুট () ব্যবহার করে অন্যান্য প্ল্যাটফর্মগুলিতেও কাজ করা উচিত। প্রথম সমাধানটি যখন মাল্টি প্ল্যাটফর্ম হয় তখন বিকল্প বিকল্প উইন্ডোজ সলিউশন সরবরাহ করার জন্য পয়েন্টগুলি ডক করা হাস্যকর।
কোরি বাকলি

7
@ সোলারস্যাটর্ন 9 প্রশ্নটি এবং উত্তরটি পুনরায় পড়ুন: inputকোনও কী চাপলে কেবল চালানো হয় না, কেবল এন্টার চাপলে।
ctrl-alt-delor

13
@ জনটির্সন কারণ পাইথন ২. 2. এর ইনপুট নামে একটি ফাংশন রয়েছে যা আপনার ইনপুটটির স্ট্রিংকে মূল্যায়ন করে। ঠিক করতে, কাঁচা ইনপুট ব্যবহার করুন
স্যামি

316

পাইথন 2 এ করার একটি উপায় হ'ল ব্যবহার করা raw_input():

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

অজগর 3 এ ঠিক input()


17
যখন এটি কীগুলির একটি হতে পারে তখন কী হবে? শুধু না enter?
noio

33
পাইথন 3+ এর সাথে , এটি ঠিক হয়ে গেছে input()
পালসুইম

পাই 2 এবং পাই 3 সামঞ্জস্যপূর্ণ কোডের জন্য ছয় ব্যবহার করে :from six.moves import input; input("Press Enter to continue...")
rcoup

56

আমার লিনাক্স বাক্সে, আমি নিম্নলিখিত কোডটি ব্যবহার করি। এটি আমি অন্য কোথাও দেখেছি কোডের অনুরূপ (উদাহরণস্বরূপ পুরাতন অজগর প্রশ্নাবলী) তবে এই কোডটি একটি টাইট লুপে স্পিন করে যেখানে এই কোডটি দেয় না এবং প্রচুর অদ্ভুত কোণার কোড রয়েছে যে কোডটি তার জন্য অ্যাকাউন্ট করে না where কোড করে।

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
@ মালা যে খাঁটি পাইথনে খুব সম্ভবত সম্ভব নয়; সম্ভবত আপনি একটি সি মডিউল লিখতে হবে?
বিড়াল

আমি আমার সিস্টেমে কীবোর্ড ইন্টারপেট (Ctrl-C) এ "\ x03" পাচ্ছি।
জিডিআর

1
ctrl-c একটি ascii 3 তাই এটি প্রত্যাশিত। আপনি যদি সিটিআরএল-সি-তে সিগন্যাল বাড়াতে চান তবে সহজ সমাধানটি হ'ল একটি অর্ড (রিটার্ন_ভ্যালু) == 3: os.kill (os.getpid (), সিগন্যাল.সিআইজিএনটি) তবে আপনি সিগন্যাল প্রসেসিং বন্ধও করতে পারেন অ্যাটর্স দ্বারা [0] | = termios. BRKINT, অ্যাটর্স [3]! = termios.ISIG, এবং কী-বোর্ড ইন্টারটার্ট প্রসেসিং বাদে পরিত্রাণ পান। দ্রষ্টব্য - আমি আপনার প্রশ্নের সম্মানের জন্য কীবোর্ড ইন্টারটারপের জন্য ফেরত মানকে '\ x03' হিসাবে পরিবর্তন করেছি (এবং কারণ এটি এই কোডটিকে সর্বদা একটি স্ট্রিং ফিরিয়ে দেয়)।
মহিমান

উপরের কোডটি কীভাবে সমন্বয় করা গেল যাতে এটি "পেজ আপ" বা "বাম তীর" এর মতো জটিল কী প্রেসের জন্য একটি টিপল দেয়?
ডেরেক

33

সিস্টেম কমান্ডের উপর নির্ভর করে যদি আপনি ঠিক থাকেন তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

লিনাক্স:

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

উইন্ডোজ:

import os
os.system("pause")

আপনি যদি সিগন্যাল না উঠা পর্যন্ত চালিয়ে যেতে চান (যেমন সিগিন্ট), আপনি রিটার্নের মানটি পরীক্ষা করে systemতারপরেও কল করতে পারেন sys.exit(0)
জেমস টেলর

29

সহজভাবে ব্যবহার

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

সিনট্যাক্সেরর সৃষ্টি করবে: পার্স করার সময় প্রত্যাশিত ইওএফ।

সাধারণ ফিক্স ব্যবহার:

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

5
inputপাইথন 2 এ ব্যবহার করবেন না - সঠিক ফাংশনটি raw_input। পাইথন 2 এ, inputসমান eval(raw_input())
ব্লারগার্ড

2
এটি ব্যবহারকারীদের টিপতে সমস্ত কী উপেক্ষা করে, যতক্ষণ না তারা এন্টার চাপায়, যা ওপি যা বলছে তার থেকে একেবারেই আলাদা।
জোনাথন হার্টলি

1
এছাড়াও, আপনি যদি 'ইনপুট' ব্যবহার করতে যাচ্ছিলেন, একটি সিনট্যাক্সেরর ধরা উপযুক্ত নয়। ব্যবহারকারীর প্রকার যা-ই মূল্যায়িত হয়, সুতরাং, উদাহরণস্বরূপ, তারা "1/0" টাইপ করলে সিন্ট্যাক্সেররের পরিবর্তে একটি জিরো ডিভিশনইরার উত্থাপিত হয় এবং আপনার প্রোগ্রামটি প্রস্থান করবে।
জোনাথন হার্টলি

@ ব্লগারবার্ড যেমন উল্লেখ করেছেন, কেবল কাঁচা_পিন্ড ("চালিয়ে যাওয়ার জন্য এন্টার টিপুন ...") ব্যবহার করা যথেষ্ট। ডিবাগ করার সময় আমি এখন প্রায়শই এটি ব্যবহার করি।
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এবং আমার এটির প্রয়োজন নেই। আমি এই কোডটি বিশেষত ব্যবহার করছি কারণ আমি এটি ব্লক করতে চাই। ;)

সংযোজন:

আমি এটি পিপিআইতে একটি প্যাকেজে কনসোল নামে প্রচুর অন্যান্য গুডি সহ প্রয়োগ করেছি :

>>> from console.utils import wait_key

>>> wait_key()
'h'

1
আমি ত্রুটি পেয়েছি: ডিভাইসের জন্য অনুপযুক্ত ioctl '
বেনোইট

@ বেনোইট কোন ওএস?
গ্রিঙ্গো সুভেভ 18

14

প্ল্যাটফর্মটি এটি করার স্বাধীন উপায় সম্পর্কে আমি জানি না, তবে উইন্ডোজের অধীনে, আপনি যদি এমএসভিসিআরটি মডিউলটি ব্যবহার করেন তবে আপনি এর গ্যাচ ফাংশনটি ব্যবহার করতে পারেন:

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

mscvcrt- এ অ-ব্লকিং কেবিট () ফাংশনটিও অন্তর্ভুক্ত রয়েছে এটি দেখার জন্য যে কোনও কীটি অপেক্ষা না করে চাপানো হয়েছে কিনা (নিশ্চিত না যে এটি সম্পর্কিত কোনও শাপের কাজ রয়েছে কিনা) if ইউনিক্সের অধীনে, এখানে শাপের প্যাকেজ রয়েছে, তবে নিশ্চিত না যে আপনি এটি সমস্ত পর্দার আউটপুট ব্যবহার না করে ব্যবহার করতে পারবেন কিনা। এই কোডটি ইউনিক্সের অধীনে কাজ করে:

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

নোট করুন যে ক্রেপস.ট্যাচ () কী টিপানো কীটির অর্ডিনালটি দেয় যাতে এটির মতো আউটপুট আমাকে কাস্ট করতে হয়েছিল।


ম্যানুয়াল দ্বারা বর্ণিত বরং সংশ্লেষিত উদাহরণগুলির চেয়ে অভিশাপগুলি ব্যবহার করা অনেক সুন্দর, এমনকি এটিতে যদি একটি বিশাল নির্ভরতা জড়িত। +1
দামিয়ান

4

আপনি যদি প্রবেশের জন্য অপেক্ষা করতে চান (তাই ব্যবহারকারী কীবোর্ডটি ছুঁড়ে ফেলার ফলে অনিচ্ছাকৃত কিছু ঘটায় না) use

sys.stdin.readline()

2
পুরো পয়েন্টটি হ'ল ব্যবহারকারীকে কেবল এন্টার কী টিপতে হবে না, উদাহরণস্বরূপ স্পেসবারকে কেবল চড় মারতে সক্ষম হবেন। অযৌক্তিক কিছু ঘটতে থেকে বাঁচতে যদি আপনার এন্টারের প্রয়োজন হয় তবে এটি খারাপ নকশা।
Synetech

3

আমি পাইথনে নতুন এবং আমি ইতিমধ্যে ভাবছিলাম যে আমি এখানে দেওয়া সহজ পরামর্শগুলি পুনরুত্পাদন করতে খুব বোকা। দেখা যাচ্ছে যে একটি সমস্যা অবশ্যই জানা উচিত:

আইডিএল থেকে পাইথন-স্ক্রিপ্ট কার্যকর করা হলে কিছু আইও-কমান্ড সম্পূর্ণ ভিন্ন আচরণ করে বলে মনে হয় (যেহেতু এখানে কোনও টার্মিনাল উইন্ডো নেই)।

যেমন। msvcrt.getch অ-ব্লক করা এবং সর্বদা $ ff প্রদান করে। এটি ইতিমধ্যে অনেক আগে রিপোর্ট করা হয়েছে (উদাহরণস্বরূপ https://bugs.python.org/issue9290 দেখুন ) - এবং এটি স্থির হিসাবে চিহ্নিত হয়েছে, কোনওভাবে সমস্যাটি পাইথন / আইডিএল এর বর্তমান সংস্করণগুলিতে বজায় রয়েছে বলে মনে হচ্ছে।

সুতরাং উপরে পোস্ট করা কোডগুলির মধ্যে যদি কোনওটি আপনার পক্ষে কাজ করে না, তবে স্ক্রিপ্টটি ম্যানুয়ালি চালানোর চেষ্টা করুন, এবং আইডিএল থেকে নয়


0

যদি আপনি দেখতে চান যে তারা কোনও সঠিক কী টিপেছে কিনা (যেমন 'বি' বলুন) এটি করুন:

while True:
    choice = raw_input("> ")

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

8
এর জন্য ব্যবহারকারীর 'বি' (বা অন্য কিছু) টাইপ করতে হবে এবং তারপরে এন্টার টিপুন, যা ওপি যা বলছে তার চেয়ে আলাদা।
জোনাথন হার্টলি

0

ওএস.সিস্টেমটি সর্বদা শকে আহ্বান করে বলে মনে হয়, যা পড়ার জন্য s এবং n বিকল্পগুলি স্বীকৃতি দেয় না। তবে পঠিত কমান্ড বাশকে দেওয়া যেতে পারে:

 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.