13

我有一个 Python3 脚本,可以将其输出写入标准输出,但是当我将该输出通过管道传输到头部或尾部时它会抱怨。请注意,在下面的示例输出中,它可以正常工作,即head按要求返回前两行输出。

> ./script.py '../Testdata/*indels.ss' -m 5 | head -2                                                                                              ~/Databases/Avian_genomes/Sandbox/combined
xread
2999 50
Traceback (most recent call last):
  File "./new.py", line 194, in <module>
    sys.stdout.write(lineout)
IOError: [Errno 32] Broken pipe
Exception IOError: IOError(32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored

相反,该脚本在将其输出通过管道传送到 awk 方面没有问题,如下所示。

> ./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR < 3 {print $0}'                                                                              ~/Databases/Avian_genomes/Sandbox/combined
xread
2999 50

让我知道您是否需要脚本中的一些代码,而不是错误消息中包含的代码。我不确定什么是相关的。

4

2 回答 2

14
./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR >= 3 {exit} 1'

将显示与 相同的行为head -2

您可以将SIGPIPE处理程序设置为一个安静地杀死您的程序的处理程序:

import signal
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
于 2012-07-10T23:11:21.337 回答
10

我将从这里引用:

如果管道中出现一系列命令,并且其中一个

读取命令在写入器完成之前完成,

writer 收到一个 SIGPIPE 信号。

就是head这样。您的脚本尚未完成编写,但head已经完成,因此stdout已关闭,因此出现异常。

于 2012-07-10T23:10:40.943 回答