사용하는 방법을 지적해야 할 의무가 있다고 생각합니다.
signal(SIGPIPE, SIG_DFL)
실제로 위험합니다 (이미 David Bennet이 의견에서 제안했듯이). 내 경우에는 multiprocessing.Manager
(표준 라이브러리가 여러 곳에서 발생하는 BrokenPipeError에 의존하기 때문에) 플랫폼에 의존하는 재미있는 비즈니스 로 이어졌습니다. 길고 고통스러운 이야기를 짧게 만들기 위해 다음과 같이 수정했습니다.
먼저 IOError
(Python 2) 또는 BrokenPipeError
(Python 3) 을 잡아야합니다 . 프로그램에 따라 해당 시점에서 일찍 종료하거나 예외를 무시할 수 있습니다.
from errno import EPIPE
try:
broken_pipe_exception = BrokenPipeError
except NameError:
broken_pipe_exception = IOError
try:
YOUR CODE GOES HERE
except broken_pipe_exception as exc:
if broken_pipe_exception == IOError:
if exc.errno != EPIPE:
raise
그러나 이것만으로는 충분하지 않습니다. Python 3은 여전히 다음과 같은 메시지를 인쇄 할 수 있습니다.
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
불행히도 그 메시지를 제거하는 것은 간단하지 않지만 마침내 http://bugs.python.org/issue11380을 찾았습니다. 여기서 Robert Collins는 내가 메인 함수를 래핑 할 수있는 데코레이터로 바꾼이 해결 방법을 제안합니다. 들여 쓰기):
from functools import wraps
from sys import exit, stderr, stdout
from traceback import print_exc
def suppress_broken_pipe_msg(f):
@wraps(f)
def wrapper(*args, **kwargs):
try:
return f(*args, **kwargs)
except SystemExit:
raise
except:
print_exc()
exit(1)
finally:
try:
stdout.flush()
finally:
try:
stdout.close()
finally:
try:
stderr.flush()
finally:
stderr.close()
return wrapper
@suppress_broken_pipe_msg
def main():
YOUR CODE GOES HERE
print(f1.readlines())