1. python出现broken pipe错误
今天写 Python2 程序遇到一个问题,为说明这个问题,写一个演示程序,它的代码如下:
import sys
for line in sys.stdin:
print line.strip('\n')
该演示程序的功能就是从标准输入读取内容输出到标准输出,当以如下方式使用时程序会报错:
ps -elf | python test_pipe.py | head -n 10
报错内容如下:
Traceback (most recent call last):
File "test_pipe.py", line 6, in <mole>
print line.strip('\n')
IOError: [Errno 32] Broken pipe
而将head命令换成tail命令则不会报错。
网上搜索了下,找到了解决方法。解决方法如下:
import sys
from signal import signal, SIGPIPE, SIG_DFL
# 让 python 忽略 SIGPIPE 信号,并且不抛出异常
signal(SIGPIPE,SIG_DFL)
for line in sys.stdin:
print line.strip('\n')
该问题产生的原因是:当head程序从管道的一端读取到足够的数据后就会关闭管道,而python程序正在管道的另一端写入,于是python程序就会接收到SIGPIPE信号使程序异常退出。而tail命令是等管道写入完成后再关闭管道,所以不会有这个问题。