如何在python中编写unix过滤器?

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缓冲它.

  • 他确实说"无缓冲",但我不确定它真的很重要. (2认同)

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.


Mik*_*ers 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)
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以查看它的功能.


EmF*_*mFi 5

使用 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)