2016-12-14 25 views
1

我運行下面的程序在Python 3.5.2在Windows 10:Python的輸入()不MINGW終端檢測EOL(但確實在CMD端子)

username = input('uname:') 

如果我在一個運行MINGW終端,input()函數提供了一個提示符,但是在我輸入一些文本後輸入<RETURN>鍵後無法返回。

在命令(cmd.exe)終端中運行相同的程序,input()返回字符串按預期。

我懷疑這是關於Windows與MinGW中不同的EOL表示形式。我試圖通過輸入^M <RETURN>無效欺騙Windows EOL。

理想情況下,我想解決「的腳本」這一問題,並使其對用戶透明,但做不到這一點,我想一些解決方案,即使意味着用戶必須鍵入一些神奇的鑰匙組合。

順便說一句,如果我在Visual Studio代碼python調試器中運行腳本發生同樣的問題(不檢測EOL)。

回答

2

我最近有一個類似的問題。

一些環顧四周後,我結束了開溝input和像這樣的東西,檢查底線字符的條例去(基於this答案):

import sys 
import os 

try: 
    # Win32 
    from msvcrt import getch 
except ImportError: 
    # UNIX 
    import tty 
    import termios 

    def getch(): 
     # print('READING!') 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     try: 
      tty.setraw(fd) 
      ch = sys.stdin.read(1) 
      sys.stdout.write(ch) 
      sys.stdout.flush() 
      return ch 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old) 

input = [] 

while True: 
    char = getch() 
    input.append(char) 

    # crtl + c 
    if ord(char) == 3: 
     print('input: {}'.format(''.join(input))) 
     sys.exit() 
    # \n 
    elif ord(char) == 10: 
     print('input: {}'.format(''.join(input))) 
     sys.exit() 
    # \r 
    elif ord(char) == 13: 
     print('input: {}'.format(''.join(input))) 
     sys.exit() 
    elif ord(char) == ord(os.linesep): 
     print('input: {}'.format(''.join(input))) 
     sys.exit()