【问题标题】:shell multipipe broken with multiple python scriptsshell multipipe 被多个 python 脚本破坏
【发布时间】: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也会有问题。

标签: python bash shell pipe


【解决方案1】:

如果您以交互方式运行 line_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()

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多