मुझे लगता है कि विधि का उपयोग करने के लिए बाध्य लगता है
signal(SIGPIPE, SIG_DFL)
वास्तव में खतरनाक है (जैसा कि पहले ही डेविड बेनेट द्वारा टिप्पणियों में सुझाया गया है) और मेरे मामले में प्लेटफ़ॉर्म-निर्भर मज़ेदार व्यवसाय का नेतृत्व किया गया था जब multiprocessing.Manager
(क्योंकि मानक पुस्तकालय ब्रोकनपाइप पर निर्भर करता है कई स्थानों पर उठाया जा रहा है)। एक लंबी और दर्दनाक कहानी को छोटा करने के लिए, मैंने इसे कैसे तय किया:
सबसे पहले, आपको IOError
(अजगर 2) या BrokenPipeError
(पायथन 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
हालाँकि, यह पर्याप्त नहीं है। अजगर 3 अभी भी इस तरह एक संदेश मुद्रित कर सकते हैं:
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
दुर्भाग्य से उस संदेश से छुटकारा पाना सीधा नहीं है, लेकिन मुझे अंततः http://bugs.python.org/issue11380 मिला जहां रॉबर्ट कॉलिंस ने इस समाधान का सुझाव दिया है कि मैं एक सज्जाकार में बदल गया हूं आप अपने मुख्य कार्य के साथ लपेट सकते हैं (हां, यह बहुत पागल है खरोज):
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())