我有一个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
如果您需要脚本中的某些代码超出错误消息中包含的内容,请告诉我。我不确定什么是相关的。
答案 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
已关闭,因此异常。