为什么我的Python3脚本不愿意将其输出汇总到head或tail(sys模块)?

时间:2012-07-10 22:57:06

标签: python python-3.x pipe

我有一个Python3脚本将其输出写入stdout,但是当我将输出传输到head或tail时,它会抱怨。请注意下面的示例输出中它有用,因为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

如果您需要脚本中的某些代码超出错误消息中包含的内容,请告诉我。我不确定什么是相关的。

2 个答案:

答案 0 :(得分:13)

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

会显示与head -2相同的行为。

您可以将SIGPIPE处理程序设置为悄然杀死程序的处理程序:

import signal
signal.signal(signal.SIGPIPE, signal.SIG_DFL)

答案 1 :(得分:10)

我会引用here

  

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

     

阅读命令在作者完成之前完成,

     

writer收到SIGPIPE信号。

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