में "अपवाद ... अनदेखा" संदेश का प्रिंटआउट दबाकर पाइथन में एक ज्ञात समस्या है, जहां "close failed in file object destructor" when "Broken pipe" happens on stdout - Python tracker Issue 11380; python - Why does my Python3 script balk at piping its output to head or tail (sys module)? - Stack Overflow में भी देखा गया।पायथन 3
मैं क्या करना चाहता हूं, यह समस्या तब होती है जब यह समस्या होती है, दोनों पायथन 2.7 और पायथन 3+ में। तो मैं एक परीक्षण स्क्रिप्ट, testprint.py
इसे चलाने के तैयार करने और (स्निपेट bash
में किया दिखाया गया है, उबंटू 11.04):
$ cat > testprint.py <<"EOF"
import sys
def main():
teststr = "Hello " * 5
sys.stdout.write(teststr + "\n")
if __name__ == "__main__":
main()
EOF
$ python2.7 testprint.py
Hello Hello Hello Hello Hello
$ python2.7 testprint.py | echo
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
$ python3.2 testprint.py | echo
Exception IOError: (32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored
ऊपर दिए गए लिंक से उम्मीद थी, वहाँ दो अलग-अलग संदेशों हैं। Help with a piping error (velocityreviews.com) में, sys.stdout.flush()
का उपयोग करने के लिए पाइथन 2 को उस संदेश के बजाय IOError पंजीकृत करने के लिए मजबूर करने की अनुशंसा की जाती है; उस के साथ, हमने:
$ cat > testprint.py <<"EOF"
import sys
def main():
teststr = "Hello " * 5
sys.stdout.write(teststr + "\n")
sys.stdout.flush()
if __name__ == "__main__":
main()
EOF
$ python2.7 testprint.py | echo
Traceback (most recent call last):
File "testprint.py", line 9, in <module>
main()
File "testprint.py", line 6, in main
sys.stdout.flush()
IOError: [Errno 32] Broken pipe
$ python3.2 testprint.py | echo
Traceback (most recent call last):
File "testprint.py", line 9, in <module>
main()
File "testprint.py", line 6, in main
sys.stdout.flush()
IOError: [Errno 32] Broken pipe
Exception IOError: (32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored
ठीक है, करीब हो रही ... अब, जिस तरह से "अनदेखा" करने के लिए इन अपवादों (या मेरे मामले में, एक कस्टम त्रुटि संदेश के साथ की जगह), उन्हें संभाल करने के लिए है:
Ignore exceptions - comp.lang.python
> वहाँ बनाने के लिए [दुभाषिया] अपवाद की अनदेखी कोई तरीका है।
नहीं। या तो अपवाद या कोड लिखें जो अपवाद उत्पन्न नहीं करता है।
... और An Introduction to Python - Handling Exceptions नोट्स के रूप में, ऐसा करने का तरीका ब्लॉक को छोड़कर/निकालने का तरीका है। तो चलो कि कोशिश करते हैं:
$ cat > testprint.py <<"EOF"
import sys
def main():
teststr = "Hello " * 5
try:
sys.stdout.write(teststr + "\n")
sys.stdout.flush()
except IOError:
sys.stderr.write("Exc: " + str(sys.exc_info()[0]) + "\n")
if __name__ == "__main__":
main()
EOF
$ python2.7 testprint.py | echo
Exc: <type 'exceptions.IOError'>
$ python3.2 testprint.py | echo
Exc: <class 'IOError'>
Exception IOError: (32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored
ठीक है, तो अजगर 2.7 के लिए काम करता है को छोड़कर कोशिश/यह के रूप में मैं उम्मीद - लेकिन फिर, अजगर 3.2 दोनों हैंडल की उम्मीद, और अभी भी एक Exception ... ignored
संदेश उत्पन्न करता है के रूप में! समस्या क्या है - क्या "except IOError
" पाइथन 3 के लिए पर्याप्त नहीं है? लेकिन यह होना चाहिए - अन्यथा यह कस्टम "Exc:...
" संदेश मुद्रित नहीं होता!
तो - यहां समस्या क्या है, और Exception ... ignored
अभी भी पाइथन 3 में क्यों मुद्रित है, भले ही मैं अपवाद को संभालने में सक्षम हूं? और सबसे महत्वपूर्ण बात यह है कि, मैं इसे कैसे संभाल सकता हूं ताकि Exception ... ignored
प्रिंट नहीं किया गया है?
यह मेरे लिए सिर, पूंछ, कम, अधिक और अद्वितीय के साथ काम करता है, ऐसा लगता है कि विशेष रूप से गूंज के साथ बातचीत में वास्तविक बग है। "अपवाद अनदेखा" हिस्सा वास्तव में दुभाषिया शट डाउन के दौरान होता है जब यह मानक धाराओं को फिर से फ़्लश करने का प्रयास करता है। – ncoghlan