在Python 2.7.6中从stdin读取。 Sys.stdout.flush()和python -u不起作用

时间:2014-10-22 03:25:43

标签: python python-2.7 stdout stdin eof

似乎许多人一直在努力获取缓冲区和stdin以及stout工作在多种Python上。我正在用Python 2.7.6编写一个脚本来从stdin读取,进行正则表达式匹配,并打印匹配字符串列表。

import re, sys

barcodes=["The barcodes are:"]
curr=barcodes[0]

#iterate through stdin
for line in sys.stdin.readlines():
        #do regex match in line
        match = re.search('(?<=\:)[GATC]{6}', line.rstrip()).group(0)
        matched = 0
        #see if match has been seen before
        if (match == curr):
                matched = 1
                print "matched curr"
        else:
                for a , val in enumerate(barcodes):
                        if (match == val):
                                print str(a) + " : " + val + " barcodes[a] " + str(barcodes[a])
                                curr = barcodes[a]
                                print curr
                                matched = 1
                                print "matched iteration"
        #if match hasn't been seen before
        if (matched == 0):
                sys.stdout.write("NEW match")
                sys.stdout.flush()
                barcodes.append(match)

#print report of barcodes
for i in barcodes:
        print i

在我发现之前就像许多人一样,等待它从stdin读取EOF块以打印任何东西,我似乎无法找到任何关于如何从stdin读取进程运行/打印的文档。

要清楚,无论我是否使用-u标志调用Python,都会发生这种情况。

感谢您提供给我的任何指导。

3 个答案:

答案 0 :(得分:1)

以下是一些一次读取sys.stdin一行的示例。他们需要使用python -u选项。

#! /usr/bin/env python

import sys

def main():
    count = 1
    while True:
        line = sys.stdin.readline()
        if line == '':
            break   #EOF encountered

        print "%3d: [%s]" % (count, line[:-1])
        count += 1


if __name__ == '__main__':
    main()

如果你使用的是Linux / Unix,这个版本更好,因为它可以让你进行行编辑。

#! /usr/bin/env python

import sys
import readline

def main():
    count = 1
    while True:
        try:
            line = raw_input()
            print "%3d: [%s]" % (count, line)
            count += 1
        except EOFError:
            break


if __name__ == '__main__':
    main()

答案 1 :(得分:1)

sys.stdin只是一个file对象,因此如果您使用readlines(),则会继续阅读,直到读取所有行。只有在按Ctrl + D(在Linux中)时才会发生这种情况。尝试逐行阅读,如下所示:

#!/usr/bin/env python
import sys,re


while True:

     line = sys.stdin.readline()
     m = re.search("end", line)
     if m:  
        break
     else:
        print "I read:" + line

答案 2 :(得分:0)

解决方案就是这样:

for line in sys.stdin:
     # process line

由于sys.stdin是一个类似文件的对象,因此迭代它会在它们可用时一次生成一行。