Python の input()で改行をさせない方法


Python3でinput()で入力した時に改行をさせない方法はありますか。

入力を3とした時、希望する出力結果は以下のような感じです。

[code]

      | x | *2 | *4 |
    a | 3 |  6 | 12 |
    
[/code]

現状は以下のようになってしまいます。

[code]

      | x | *2 | *4 |
    a | 3
     |  6 | 12 |
    
[/code]




まず、input()
が改行を出力しているわけではなく、ユーザが改行を入力しているものを端末がエコー(ユーザが入力した内容を確認できるように出力)しているため、改行が発生します。

そのため端末の設定を変更することでしか、ユーザの改行に対して出力される改行を抑止することはできません。

以下のコードは termios モジュールをサポートしている環境であればそれっぽい動作をするかと思います。(Windows 版 Python や IDLE
では動作しません。 Windows 上の cygwin 版の Python なら動作するかと思います）

[code]

    import termios
    import sys
    import os
    
    class KeyScanner:
        def __enter__(self):
            self.fno = sys.stdin.fileno()
    
            # backup current settings
            self.termattr_backup = termios.tcgetattr(self.fno)
    
            new_attr = termios.tcgetattr(self.fno)
            new_attr[3] &= ~termios.ECHO # no echo
            new_attr[3] &= ~termios.ICANON # no canonical
            termios.tcsetattr(self.fno, termios.TCSADRAIN, new_attr)
    
            return self
    
        def __exit__(self, *args):
            # restore old settings
            termios.tcsetattr(self.fno, termios.TCSANOW, self.termattr_backup)
    
        def readInt(self):
            number_text = ''
    
            c = sys.stdin.read(1)
            while True:
                if c == '\n':
                    break
                elif c.isdigit():
                    sys.stdout.write(c)
                    sys.stdout.flush()
                    number_text += c
                c = sys.stdin.read(1)
    
            if number_text.isdigit():
                return int(number_text)
            else:
                return None
    
    
    if __name__ == "__main__":
        with KeyScanner() as scanner: 
            print("  | x | *2 | *4 |")
            print("a | ", end='', flush=True)
            x = scanner.readInt()
            if x:
                print(" | {:>2} | {:>2} |".format(x*2, x*4))
            else:
                print("\nNO INPUT ERROR!")
    
[/code]




まず、input()
が改行を出力しているわけではなく、ユーザが改行を入力しているものを端末がエコー(ユーザが入力した内容を確認できるように出力)しているため、改行が発生します。

そのため端末の設定を変更することでしか、ユーザの改行に対して出力される改行を抑止することはできません。

以下のコードは termios モジュールをサポートしている環境であればそれっぽい動作をするかと思います。(Windows 版 Python や IDLE
では動作しません。 Windows 上の cygwin 版の Python なら動作するかと思います）

[code]

    import termios
    import sys
    import os
    
    class KeyScanner:
        def __enter__(self):
            self.fno = sys.stdin.fileno()
    
            # backup current settings
            self.termattr_backup = termios.tcgetattr(self.fno)
    
            new_attr = termios.tcgetattr(self.fno)
            new_attr[3] &= ~termios.ECHO # no echo
            new_attr[3] &= ~termios.ICANON # no canonical
            termios.tcsetattr(self.fno, termios.TCSADRAIN, new_attr)
    
            return self
    
        def __exit__(self, *args):
            # restore old settings
            termios.tcsetattr(self.fno, termios.TCSANOW, self.termattr_backup)
    
        def readInt(self):
            number_text = ''
    
            c = sys.stdin.read(1)
            while True:
                if c == '\n':
                    break
                elif c.isdigit():
                    sys.stdout.write(c)
                    sys.stdout.flush()
                    number_text += c
                c = sys.stdin.read(1)
    
            if number_text.isdigit():
                return int(number_text)
            else:
                return None
    
    
    if __name__ == "__main__":
        with KeyScanner() as scanner: 
            print("  | x | *2 | *4 |")
            print("a | ", end='', flush=True)
            x = scanner.readInt()
            if x:
                print(" | {:>2} | {:>2} |".format(x*2, x*4))
            else:
                print("\nNO INPUT ERROR!")
    
[/code]

