fly*_*ire 12 python unix filter
我想编写一个读取stdin(无缓冲)的程序,并编写stdout(unbuffered)进行一些简单的char-by-char转换.为了举例说明,我想要x从stdin中删除所有字符.
Jed*_*ith 13
读取sys.stdin和写入sys.stdout(或使用print).你的示例程序:
import sys
for line in sys.stdin:
print line.replace("x", ""),
Run Code Online (Sandbox Code Playgroud)
没有标准的方法来使stdin无缓冲,你不需要它.让OS缓冲它.
Emi*_*Sit 12
您可以使用fileinput该类,它允许您处理像Perl钻石运算符那样的输入.来自文档:
import fileinput
for line in fileinput.input():
process(line)
Run Code Online (Sandbox Code Playgroud)
流程做的事情print line.replace('x','').
您可以按照此StackOverflow问题了解如何取消缓冲标准输出.或者你可以sys.stdout.flush()在每次之后打电话print.
在这种情况下,我不确切地知道你的意思是什么,但你要问的是很简单的...
so_gen.py(生成我们可以看到的常量流):
import time
import sys
while True:
for char in 'abcdefx':
sys.stdout.write(char)
sys.stdout.flush()
time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
尝试运行python so_gen.py | python so_filter.py以查看它的功能.
使用 python 解释器的 -u 开关使所有读取和写入都无缓冲。与 Perl 中的设置类似$| = true;。然后继续,读取一行并修改它,然后打印它。不需要 sys.stdout.flush() 。
#!/path/to/python -u
import sys
for line in sys.stdin:
process_line(line)
Run Code Online (Sandbox Code Playgroud)