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命令是等管道寫入完成後再關閉管道,所以不會有這個問題。