shell multipipe被多个python脚本破坏
我正在尝试将python脚本的stdout作为stdin以shell管道形式引入另一个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
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
操作强制输出。这也是一个问题。