2009-10-19 17 views

回答

7

我并不确切地知道你在这方面缓冲的意思,但它是非常简单的事你问...

so_gen.py(产生恒定流,我们可以看) :

import time 
import sys 
while True: 
    for char in 'abcdefx': 
     sys.stdout.write(char) 
     sys.stdout.flush() 
     time.sleep(0.1) 

so_filter.py(做什么你问):

import sys 
while True: 
    char = sys.stdin.read(1) 
    if not char: 
     break 
    if char != 'x': 
     sys.stdout.write(char) 
     sys.stdout.flush() 

尝试运行python so_gen.py | python so_filter.py来看看会发生什么。

+1

获胜者写作如果不是char:break' – flybywire 2009-10-19 17:45:45

+1

@flybywire:他的回答需要它,没有其他答案...... – 2009-10-19 18:00:27

13

sys.stdin中读取并写入sys.stdout(或使用print)。你的示例程序:

import sys 

for line in sys.stdin: 
    print line.replace("x", ""), 

有没有一种标准的方法来使标准输入缓冲,你不想这样。让OS缓冲它。

+2

他确实说“没有缓冲”,但我不确定它真的很重要。 – 2009-10-19 17:29:59

+0

我按照你的评论编辑了我的答案。 – 2009-10-19 17:30:49

9

您可以使用fileinput class,它可以让您像Perl钻石操作员那样处理输入。从文档:

import fileinput 
for line in fileinput.input(): 
    process(line) 

其中进程做类似print line.replace('x','')

您可以按照this StackOverflow question了解如何取消缓冲标准输出。或者您可以在每个print之后致电sys.stdout.flush()

+0

啊!这使得我所做的所有额外工作,因为我错过了Perl!我需要非常仔细地浏览Python标准库。 – 2009-10-19 17:42:05

2

为python解释器使用-u开关以使所有读取和写入无缓冲。类似于在Perl中设置$| = true;。然后继续进行,读取一行修改它然后打印它。 sys.stdout.flush()不是必需的。

#!/path/to/python -u 

import sys 

for line in sys.stdin: 
    process_line(line) 
+0

这里不工作... – 2011-02-28 17:45:30