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

Gre*_*ory 13 python pipe python-3.x

我有一个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
Run Code Online (Sandbox Code Playgroud)

相比之下,脚本没有问题,其输出通过管道传输到awk,如下所示.

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

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

eph*_*ent 13

./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR >= 3 {exit} 1'
Run Code Online (Sandbox Code Playgroud)

会表现出同样的行为head -2.

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

import signal
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,这“杀死了您的程序”。如果您的程序正在报告正在执行的状态,则添加此代码意味着您的程序现在从头开始运行时将无提示地无法完成其工作。 (2认同)

Lev*_*sky 10

我会从这里引用:

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

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

writer收到SIGPIPE信号.

这是什么head.您的脚本尚未完成写入,但head已完成,因此stdout已关闭,因此异常.