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

Python 使用sys.stdin.read()时,为什么无法从键盘输入?,python,input,stdin,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

我的代码如下:

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)

有人能告诉我原因和我如何输入来测试我的程序吗

非常感谢。

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

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

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

所以

  • 改为使用输入单行,或
  • 如果需要多行输入,请使用限制从
    stdin
    读取多少的内容:

    ll=[]        
    while True:
        l = input()    # or sys.stdin.readline().rstrip()
        if not l: break
        ll.append(l)
    
    这样,您就可以通过输入一个空行来阻止程序要求更多的输入

  • 最后,还有一种方法允许您根据输入是否是交互式的来调用不同的代码(但对于您的任务来说,这可能是一种过度使用)


您不使用
input
有什么特殊原因吗?您是如何运行程序的?您说的“我需要保持
input
方法的完整性”是什么意思
input
是一个内置函数,它完成了您需要它完成的任务。我不是说你的变量,
input
,它隐藏了内置函数。你到底为什么要使用
sys.stdin
?无论如何,
sys.stdin.read
一直从
stdin
读取,直到遇到EOF。你使用的是什么系统?当你运行这个程序时,你到底在做什么?你从来没有机会提供输入?它只是立即出错?我在Mac电脑上,我可以让它工作。这是不必要的恼人,因为您必须先按enter键,然后按ctrl-D键,这就是为什么您应该使用
input
功能,但它可以工作。。。。在线分级器如何强制您仅使用
sys.stdin.read
???它真的在找你调用那个函数吗?!您知道,
input
函数已经从标准的inUm中读取数据,这是不正确的。您可以使用
sys.stdin.read()
,它将一直读取到EOF。例如,在OSX上,您可以通过按enter键然后按cltr-d键来给它一个EOF。我想大多数Linux/Unix版本都会将CTRL-d解释为EOF.@juanpa.arrivillaga,这是我的初衷。是的,你可以,但不是在IPython中。我一直在IPython Shell中测试这一点。Windows控制台没有预先确定的控制字符来正常结束熟读(即不是Ctrl+C)。对于
ReadFile
,如果一行以Ctrl+Z(0x1A)开头,ConDrv设备将此功能嵌入,以返回读取的0字节。但这不是控制台本身的功能,任何调用
ReadConsole
或低级
ReadConsoleInput
的程序都必须手动实现此行为。这是在Python3.6中为新的控制台I/O实现的,但将来可能它可以使用
ReadConsole
pInputControl
参数让控制台本身处理Ctrl+Z和Ctrl+D的这两个操作。