আমি যে পদ্ধতিটি ব্যবহার করে তা নির্দেশ করতে বাধ্য feel
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())