使用sys.stdin.read()时,为什么我无法从键盘输入?

时间:2017-10-27 22:03:25

标签: python input stdin

我的代码如下:

def function(a, b):
    while a != 0 and b != 0:
      ...

    return x

if __name__ == "__main__":
    input = sys.stdin.read()
    a, b = map(int, input.split())
    print(function(a, b))

当我尝试运行它时,程序没有给我机会输入。

我收到以下回溯消息:

ValueError: not enough values to unpack (expected 2, got 0)

enter image description here

有人可以告诉我原因以及如何输入来测试我的程序。

非常感谢。

1 个答案:

答案 0 :(得分:0)

sys.stdin.read()会读stdin,直至达到EOF。通常情况下,当该流被另一端关闭时(即通过任何提供输入),就会发生这种情况。

如果您运行cat inputfile.txt | your_program之类的程序,则此功能正常。但是当stdin连接到您的终端时,它将在交互模式下无休止地阅读,因此从另一端关闭它的唯一方法是关闭终端。

严格地说,你可以通过在一行上输入一个EOF字符来停止read(),在Unix中为Ctrl-D,在Windows中为Ctrl-Z - 这可以在常规中使用Python控制台。但是在IPython中,这种技术不起作用:在Windows中,我将Ctrl-D视为\x04,将Ctrl-Z视为空行,并且都不会停止读取(这是否是错误或按设计是另一个问题)。

所以,

  • 使用input()代替输入一行,或
  • 如果您需要多行输入,请使用限制从stdin读取的内容的内容:

    ll=[]        
    while True:
        l = input()    # or sys.stdin.readline().rstrip()
        if not l: break
        ll.append(l)
    

    这样,您就可以通过输入空行来阻止程序要求更多输入。

  • 最后,有sys.stdin.isatty()允许你根据输入是否是交互式来调用不同的代码(但对于你的任务,这可能是一种过度杀伤)。