使用Python中的sys.stdin.readline从标准输入读取非常大的行

3

在尝试编写符合某些要求的程序时,这些要求包括需要从 stdin 读取信息并将输出打印到 stdout,我遇到了一个意外的问题。问题是 sys.stdin.readline() 没有完成对 stdin 提供的行的读取。

最小示例

#!/bin/python
from sys import stdin myline = stdin.readline().split()

要读取的行位于 http://pastebin.com/k3DsD5f6

在我的 MacBook Pro 上运行 10.8.5 和 Python 2.7,该程序在涉及 readline() 命令的行上无限期地挂起。

我得到的确切终端输出(假设我将此代码片段命名为 so_error.py)如下所示。

python so_error.py 30887 92778 36916 47794 38336 85387 60493 16650 41422 2363 90028 68691 20060 97764 13927 80541 83427 89173 55737 5212 95369 2568 56430 65783 21531 22863 65124 74068 3136 13930 79803 34023 23059 33070 98168 61394 18457 75012 78043 76230 77374 84422 44920 13785 98538 75199 94325 98316 64371 66414 3527 76092 68981 59957 41874 6863 99171 6997 97282 2306 20926 77085 36328 60337 26506 50847 21730 61314 25858 16125 53896 19583 546 98815 33368 15435 90365 44044 13751 71088 26809 17277 47179 95789 93585 5404 2652 92755 12400 99933 95061 49677 93369 47740 10013 36227 98587 48095 97540 40796 80571 51435 60379 97468 66602 10098 12903 73318 70493 26653 60757 97302 60281 24287 9442 53866 29690 28445 46620 58441 44730 58032 8118 38098 5772 34482 90676 20710 98928 4568 77857 79498 72354 54587 76966 55307 64684 6220 28625 51529 32872 5733 48830 9504 30020 58271 63369 59709 86716 26341 18150 47797 724 42619 2246 22847 93452 92922 43556 92380 97489 37765 88229 69842 92351 65194 41501 57035 87765 70125 24915 36988 75857 73744 46
它总是在这个确切的位置停止,所以这很可能是某种溢出错误。代码在短行中运行得很好。

你是如何阅读它的? - Padraic Cunningham
我的意思是这行代码从哪里来?你为什么要粘贴一行孤立的代码? - Padraic Cunningham
我无法在Linux上复制,如果我粘贴这些行,bash会报错。如果使用重定向读取,则可以正常工作。我无法看到它如何导致脚本挂起,如果在似乎挂起的情况下再次按回车键,是否会发生任何事情? - Padraic Cunningham
1个带有1个尾随换行符的字符串。 - CCG
让我们在聊天中继续这个讨论 - CCG
显示剩余21条评论
1个回答

0
你的问题并不在于readline(),而是在于你执行脚本的方式。因为你正在从stdin读取,所以需要提供stdin要读取的数据。如果不这样做,程序将无限期地挂起(就像在没有参数的情况下运行cat一样)。
我拿了你的示例代码和输入文件,并成功地像这样运行了它:
$ python so_error.py <longline.txt

它成功退出并且相当快速。我也在您的脚本末尾添加了 print myline 来验证它确实正确地解析了所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接