shell multipipe被多个python脚本破坏

shell multipipe被多个python脚本破坏,python,bash,shell,pipe,Python,Bash,Shell,Pipe,我正在尝试将python脚本的stdout作为stdin以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 li

我正在尝试将python脚本的stdout作为stdin以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:hehe

line_parser.py只需打印出它在stdin上得到的内容:

import sys

for line in sys.stdin:
  print "line=", line

我一定是错过了什么。请社区帮助我:)

如果您以交互方式运行
line\u parser.py
,会有一个提示:

$ python line_parser.py 
a
b
c
line= a

line= b

line= c
请注意,在输入“c”后,我按ctrl+D键触发EOF。您可以看到,它在开始遍历行之前,正在吞咽所有输入。因为这是一个管道,您不断地向它发送输出,所以不会发生这种情况,也不会开始处理。您需要选择一种不同的方式来迭代
stdin
,例如:

import sys

line = sys.stdin.readline()
while line:
    print "line=", line
    line = sys.stdin.readline()

这两个脚本是否执行任何类型的过滤,在组合时过滤所有输出?如果不知道每个Python脚本的功能,很难给出答案。也许
line\u parser.py
不喜欢以
.txt
结尾的单词?没有更多的信息,我们真的无能为力。没有明显的问题原因,但这只意味着您尚未显示相关信息。您似乎有两个不同的
multitail
模块,这有点令人困惑。一个是您正在运行的脚本,另一个是您正在从中导入函数的内容。问题是缓冲:数据正在通过管道传输,命令的输出被缓冲,因为输出不是“交互式设备”。这意味着您必须等待足够的材料填充第一个(Python)命令输出中的缓冲区,然后第二个命令才能看到任何内容。在各种命令(尤其是
multitail
one)中,可能有一种方法可以通过一些
flush
操作强制输出。这也是一个问题。