मुझे कुछ कोड विरासत में मिला है जो मुद्रित करने के लिए कॉल के दौरान उठाए गए इनपुट/आउटपुट त्रुटि के कारण समय-समय पर (यादृच्छिक रूप से) विफल हो रहा है। मैं उठाए जा रहे अपवाद का कारण निर्धारित करने की कोशिश कर रहा हूं (या कम से कम, इसे बेहतर समझें) और इसे सही तरीके से कैसे संभालें।IOError इनपुट/आउटपुट त्रुटि जब मुद्रण
जब (एक 2.6.6 दुभाषिया में, CentOS 5.5 पर चलने वाले) अजगर की निम्न पंक्ति को क्रियान्वित:
print >> sys.stderr, 'Unable to do something: %s' % command
अपवाद उठाया है (ट्रैस बैक छोड़े गए):
IOError: [Errno 5] Input/output error
संदर्भ के लिए , यह आम तौर पर उस समय बड़ा कार्य करने का प्रयास कर रहा है:
from subprocess import Popen, PIPE
import sys
def run_commands(commands):
for command in commands:
try:
out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate()
print >> sys.stdout, out
if err:
raise Exception('ERROR -- an error occurred when executing this command: %s --- err: %s' % (command, err))
except:
print >> sys.stderr, 'Unable to do something: %s' % command
run_commands(["ls", "echo foo"])
>>
सिंटैक्स मेरे लिए विशेष रूप से परिचित नहीं है, यह ऐसा कुछ नहीं है जिसे मैं अक्सर उपयोग करता हूं, और मैं समझता हूं कि शायद यह least preferred way है जो stderr को लिखने के लिए है। हालांकि मुझे विश्वास नहीं है कि विकल्प अंतर्निहित समस्या को ठीक करेंगे।
प्रलेखन से मैंने पढ़ा है, IOError 5 को अक्सर दुरुपयोग किया जाता है, और कुछ हद तक परिभाषित किया जाता है, विभिन्न ऑपरेटिंग सिस्टम अलग-अलग समस्याओं को कवर करने के लिए इसका उपयोग करते हैं। मेरे मामले में सबसे अच्छा मैं देख सकता हूं कि पाइथन प्रक्रिया अब टर्मिनल/पीटीआई से जुड़ी नहीं है।
सबसे अच्छा मैं कह सकता हूं कि कुछ भी stdout/stderr धाराओं से प्रक्रिया को डिस्कनेक्ट नहीं कर रहा है - टर्मिनल अभी भी उदाहरण के लिए खुला है, और सबकुछ ठीक दिखता है। क्या यह एक अशुद्ध फैशन में समाप्त होने वाली बाल प्रक्रिया के कारण हो सकता है? इस समस्या का कोई और कारण क्या हो सकता है - या इसे आगे डीबग करने के लिए मैं कौन से अन्य कदम पेश कर सकता हूं?
अपवाद को संभालने के मामले में, मैं स्पष्ट रूप से इसे पकड़ सकता हूं, लेकिन मुझे लगता है कि इसका मतलब है कि मैं निष्पादन के शेष के लिए stdout/stderr पर प्रिंट करने में सक्षम नहीं हूं? क्या मैं इन धाराओं को किसी भी तरह से दोबारा जोड़ सकता हूं - शायद sys.stdout
से sys.__stdout__
आदि को रीसेट करके? इस मामले में stdout/stderr को लिखने में सक्षम नहीं होने पर घातक माना जाता है, लेकिन अगर यह गलत होने से शुरू होने का संकेत है तो मैं जल्दी ही जमानत दूंगा।
मुझे लगता है कि अंत में मैं जहां यह एक डिबगिंग शुरू करने के लिए करने के लिए के रूप में एक नुकसान का एक सा यहां हूं ...
मैं देख सकता हूं कि कुछ लोगों ने इस प्रश्न को देखा है, कोई टिप्पणी/उत्तर नहीं। यदि प्रश्न खराब रूप से संरचित/अस्पष्ट है, तो कृपया इसे सुधारने में मेरी सहायता करें ताकि मैं एक उत्तर की ओर काम कर सकूं। –
मैं भी इस त्रुटि को समाप्त कर रहा हूं। कभी-कभी इस त्रुटि को पाने के लिए परेशान करना। –
कुछ उत्तरों के बारे में बुरा मत मानो; आपका प्रश्न और प्रारूप बहुत अच्छा है; जवाब देने के लिए यह एक मुश्किल सवाल है। – culix