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

Reading very large line from stdin using sys.stdin.readline in Python

在尝试按照特定规范编写程序时,包括要求程序从 stdin 读取信息并将输出打印到 stdout,我遇到了 运行 意外问题.问题是 sys.stdin.readline() 没有读完在 stdin 上提供给它的行。

最小示例

#!/bin/python

from sys import stdin
myline = stdin.readline().split()

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

在我的 MacBook Pro 运行ning 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

它总是停在这个准确的点上,所以这可能是某种溢出错误。该代码使用短线就可以正常工作。

您的问题根本不是 readline(),而是您执行脚本的方式。由于您正在从 stdin 读取,因此您需要为 stdin 提供要读取的数据。如果你不这样做,程序将无限期挂起(就像你 运行 cat 没有参数一样)。

我使用了您的示例代码和输入文件,并且能够成功地 运行 它是这样的:

$ python so_error.py <longline.txt

退出成功,速度相当快。我还在脚本末尾添加了 print myline 以验证它确实正确解析了所有内容。