【问题标题】:When using sys.stdin.read(), why I am not able to input from keyboard?使用 sys.stdin.read() 时,为什么我无法从键盘输入?
【发布时间】:2017-10-27 22:03:24
【问题描述】:

我的代码如下:

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)

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

非常感谢。

【问题讨论】:

  • 你没有使用input有什么特别的原因吗??
  • 你是如何运行你的程序的?
  • “我需要保持input 方法完好无损”是什么意思? input 是一个内置函数,可以满足您的需要。我不是在谈论您的变量input,它隐藏了内置函数。你到底为什么要使用sys.stdin?无论如何,sys.stdin.read 一直从stdin 读取,直到遇到 EOF。你在什么系统上?当你运行这个时你到底在做什么?
  • 您从来没有机会提供意见吗?它只是立即出错?我在 Mac 上,我可以让它工作。这很烦人,因为您必须按 Enter 然后 ctrl-D,这就是为什么您应该使用input 函数,但它确实有效。
  • ...在线评分者如何强制使用sys.stdin.read???它真的在寻找你调用那个函数吗?!您意识到,input 函数已经从标准中读取

标签: python input stdin


【解决方案1】:

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

如果您像cat inputfile.txt | your_program 这样运行您的程序,这将有效。但是当stdin 连接到您的终端时,它只会在交互模式下无休止地阅读,所以从另一端关闭它的唯一方法就是关闭终端。

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

所以,

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

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

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

  • 最后,sys.stdin.isatty() 允许您根据输入是否为交互式调用不同的代码(但对于您的任务,这可能是多余的)。

【讨论】:

  • 嗯,这不是真的。您可以使用sys.stdin.read(),它将一直读取到 EOF。你可以给它一个 EOF,例如在 OSX 上,通过按 enter 然后 cltr-d。我认为大多数 Linux/Unix 风格只会将 CTRL-d 解释为 EOF。
  • @juanpa.arrivillaga 我明白了。是的,你可以,但在 IPython 中不行。
  • 我一直在 Ipython shell 中测试这个。
  • Windows 控制台没有预先确定的控制字符来正常结束熟读(即不是 Ctrl+C)。对于ReadFile,如果行以 Ctrl+Z (0x1A) 开头,ConDrv 设备会破解此功能以返回读取的 0 字节。但这不是控制台本身的功能,任何调用ReadConsole 或低级ReadConsoleInput 的程序都必须手动实现此行为。这是在 Python 3.6 中为新的控制台 I/O 实现的,但也许将来它可以使用 ReadConsolepInputControl 参数让控制台本身为 Ctrl+Z 和 Ctrl+D 处理此问题。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2015-04-12
相关资源
最近更新 更多