【发布时间】:2016-07-28 01:03:32
【问题描述】:
我正在尝试将 python 脚本的标准输出作为标准输入通过 shell 管道传输到另一个 python 脚本,如下所示:
find ~/test -name "*.txt" | python my_multitail.py | python line_parser.py
它应该打印一个输出,但没有输出。
请注意,这是可行的:
find ~/test -name "*.txt" | python my_multitail.py | cat
这也有效:
echo "bla" | python line_parser.py
my_multitail.py 打印出 .txt 文件的新内容:
from multitail import multitail
import sys
filenames = sys.stdin.readlines()
# we get rid of the trailing '\n'
for index, filename in enumerate(filenames):
filenames[index] = filename.rstrip('\n')
for fn, line in multitail(filenames):
print '%s: %s' % (fn, line),
sys.stdout.flush()
当向 .txt 文件添加新行时(“hehe”),my_multitail.py 会打印:
/home/me/test2.txt:呵呵
line_parser.py 只是打印出它在标准输入上得到的内容:
import sys
for line in sys.stdin:
print "line=", line
我一定错过了一些东西。请社区帮助我:)
【问题讨论】:
-
这两个脚本是否会进行任何类型的过滤,当组合时会过滤所有输出?如果不知道每个 Python 脚本的作用,就很难给出答案。
-
也许
line_parser.py不喜欢以.txt结尾的词?没有更多信息,我们真的无能为力。没有明显的问题原因,但这仅意味着您尚未显示相关信息。 -
您似乎有两个不同的
multitail模块,这有点令人困惑。一个是您正在运行的脚本,另一个是您从中导入函数的脚本。 -
问题在于缓冲:数据正在通过管道传输,并且命令的输出被缓冲,因为输出不是“交互式设备”。这意味着您必须等待足够的材料来填充第一个(Python)命令的输出中的缓冲区,然后第二个命令才能看到任何内容。可能有一种方法可以通过各种命令中的一些
flush操作(尤其是multitail)来强制输出。而且FatalErrordiagnosed也会有问题。