Kullanan yöntemin olduğunu belirtmek zorunda hissediyorum
signal(SIGPIPE, SIG_DFL)
gerçekten tehlikelidir (yorumlarda David Bennet tarafından daha önce önerildiği gibi) ve benim multiprocessing.Manager
durumumla birleştirildiğinde platforma bağlı komik işlere yol açtı (çünkü standart kütüphane, BrokenPipeError'ın birkaç yerde yükseltilmesine dayanıyor). Uzun ve acı verici bir hikayeyi kısaltmak için, bunu şu şekilde düzelttim:
Öncelikle IOError
(Python 2) veya BrokenPipeError
(Python 3) ' ü yakalamalısın . Programınıza bağlı olarak, bu noktada erken çıkmayı deneyebilir veya istisnayı göz ardı edebilirsiniz:
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
Ancak bu yeterli değil. Python 3 yine de böyle bir mesaj yazdırabilir:
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
Maalesef bu mesajdan kurtulmak kolay değil, ancak sonunda http://bugs.python.org/issue11380 Robert Collins'in ana işlevinizi sarabileceğiniz bir dekoratöre dönüştürdüğüm bu geçici çözümü önerdiği yerde buldum (evet, bu biraz çılgınca girinti):
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())