Using msvcrt.getch() in Eclipse / PyDev

前端 未结 1 974
余生分开走
余生分开走 2020-12-11 05:06

I wanted to use msvcrt.getch() in Eclipse with PyDev to read a signe char but I found out that it just don\'t work (but It works in the Windows console).

相关标签:
1条回答
  • 2020-12-11 05:40

    Maybe use sys.stdin.read when run in PyDev? like sys.stdin.read(1) read 1 line from input...For use in Windows console and in PyDev make same selection based on os and run variants(using sys.stdin.isatty). For example next code read timelimited user input. But when run in Windows console if program's standard input is piped in with another program's standard output, then sys.stdin.isatty returns False and input read with sys.stdin.read, not msvcrt.getch:

    import sys, time
    import platform
    if platform.system() == "Windows":
        import msvcrt
    else:
        from select import select
    
    def input_with_timeout_sane(prompt, timeout, default):
        """Read an input from the user or timeout"""
        print prompt,
        sys.stdout.flush()
        rlist, _, _ = select([sys.stdin], [], [], timeout)
        if rlist:
            s = sys.stdin.readline().replace('\n','')
        else:
            s = default
            print s
        return s
    def input_with_timeout_windows(prompt, timeout, default): 
        start_time = time.time()
        print prompt,
        sys.stdout.flush()
        input = ''
        read_f=msvcrt.getche
        input_check=msvcrt.kbhit
        if not sys.stdin.isatty( ):
            read_f=lambda:sys.stdin.read(1)
            input_check=lambda:True
        while True:
            if input_check():
                chr_or_str = read_f()
                try:
                    if ord(chr_or_str) == 13: # enter_key
                        break
                    elif ord(chr_or_str) >= 32: #space_char
                        input += chr_or_str
                except:
                    input=chr_or_str
                    break #read line,not char...        
            if len(input) == 0 and (time.time() - start_time) > timeout:
                break
        if len(input) > 0:
            return input
        else:
            return default
    
    def input_with_timeout(prompt, timeout, default=''):
        if platform.system() == "Windows":
            return input_with_timeout_windows(prompt, timeout, default)
        else:
            return input_with_timeout_sane(prompt, timeout, default)
    
    print "\nAnswer is:"+input_with_timeout("test?",10,"no input entered")
    
    0 讨论(0)
提交回复
热议问题