दिलचस्प पोस्ट
क्या एक नल पॉइंटर अपवाद को पकड़ना एक कोड गंध है? अल्पविराम से अलग वेक्टर बनाना एंड्रॉइड में फेसबुक एंड्रॉइड एसडीके के साथ फेसबुक पर फोटो अपलोड करें Matplotlib अक्ष में सापेक्ष बदलाव कैसे निकालें स्विफ्ट, स्ट्रिंग्स और मेमोरी एड्रेस इनपुट पूरा होने पर स्कैनर को समाप्त कैसे करें? कैसे एक संदर्भ प्रोग्राम जोड़ने के लिए कस्टम टाइपफ़ेस के साथ मैं टाइपफ़ेसस्पैन या स्टाइलस्पेन का उपयोग कैसे कर सकता हूं? जावा में एक संख्या को मैं कैसे प्रारूपित कर सकता हूं? कोणीय 2.0 और मॉडल संवाद टेबल नामकरण दुविधा: एकवचन बनाम बहुवचन नाम पासवर्ड के लिए Regex कम से कम आठ अक्षर, कम से कम एक नंबर और दोनों कम और अपरकेस अक्षरों और विशेष वर्ण होना चाहिए एक रेखा और एक आयताकार के बीच का अंतर कैसे मिल सकता है? एंड्रॉइड ऐप पर ट्विटर एकीकरण 1.0 के एएस के अपडेट के बाद, "विधि आईडी में नहीं है: 65536" परियोजना में त्रुटि

पायथन फ़ंक्शन कॉल से stdout आउटपुट कैसे कैप्चर करें?

मैं एक पायथन लाइब्रेरी का उपयोग कर रहा हूं जो किसी वस्तु के लिए कुछ करता है

do_something(my_object) 

और इसे बदलता है ऐसा करते समय, यह स्टडआउट के लिए कुछ आंकड़ों को प्रिंट करता है, और मैं इस जानकारी पर पकड़ हासिल करना चाहता हूं। उचित समाधान के लिए प्रासंगिक जानकारी वापस करने के लिए do_something() बदलना होगा,

 out = do_something(my_object) 

लेकिन यह कुछ समय पहले हो सकता है जब do_something() के devs इस समस्या को प्राप्त करें। एक वैकल्पिक हल के रूप में, मैंने सोचा था कि जो कुछ भी करता है do_something() stdout को लिखता है

मैं कैसे कोड में दो बिंदुओं के बीच stdout आउटपुट कैप्चर कर सकता हूं, जैसे,

 start_capturing() do_something(my_object) out = end_capturing() 

?

वेब के समाधान से एकत्रित समाधान "पायथन फ़ंक्शन कॉल से stdout आउटपुट कैसे कैप्चर करें?"

इस संदर्भ प्रबंधक को आज़माएं:

 from cStringIO import StringIO import sys class Capturing(list): def __enter__(self): self._stdout = sys.stdout sys.stdout = self._stringio = StringIO() return self def __exit__(self, *args): self.extend(self._stringio.getvalue().splitlines()) del self._stringio # free up some memory sys.stdout = self._stdout 

उपयोग:

 with Capturing() as output: do_something(my_object) 

output अब फ़ंक्शन कॉल द्वारा मुद्रित लाइनों वाली एक सूची है।

उन्नत उपयोग:

क्या स्पष्ट नहीं हो सकता है कि यह एक से अधिक बार किया जा सकता है और परिणाम एकसमान हो गए हैं:

 with Capturing() as output: print 'hello world' print 'displays on screen' with Capturing(output) as output: # note the constructor argument print 'hello world2' print 'done' print 'output:', output 

आउटपुट:

 displays on screen done output: ['hello world', 'hello world2'] 

अजगर में> = 3.4, संदर्भ-सूची में एक redirect_stdout डेकोरेटर होता है। इसका उपयोग आपके प्रश्न का उत्तर देने के लिए किया जा सकता है:

 import io from contextlib import redirect_stdout f = io.StringIO() with redirect_stdout(f): do_something(my_object) out = f.getvalue() 

डॉक्स से :

प्रसंग प्रबंधक को अस्थायी रूप से sys.stdout को किसी अन्य फ़ाइल या फ़ाइल की तरह ऑब्जेक्ट पर रीडायरेक्ट करने के लिए।

यह उपकरण मौजूदा कार्यों या वर्गों के लिए लचीलापन जोड़ता है जिनके आउटपुट को stdout के लिए कठिन बना दिया गया है।

उदाहरण के लिए, सहायता () सामान्य रूप से sys.stdout को भेजा जाता है। आप आउटपुट को एक io.StringIO ऑब्जेक्ट पर रीडायरेक्ट करके एक स्ट्रिंग में उस आउटपुट को कैप्चर कर सकते हैं:

  f = io.StringIO() with redirect_stdout(f): help(pow) s = f.getvalue() 

डिस्क पर फ़ाइल में मदद () के आउटपुट को भेजने के लिए, आउटपुट को एक नियमित फ़ाइल पर रीडायरेक्ट करें:

  with open('help.txt', 'w') as f: with redirect_stdout(f): help(pow) 

Sys.stderr के लिए मदद () का उत्पादन भेजने के लिए:

 with redirect_stdout(sys.stderr): help(pow) 

ध्यान दें कि sys.stdout पर वैश्विक साइड इफेक्ट का मतलब है कि यह संदर्भ मैनेजर लाइब्रेरी कोड में उपयोग के लिए उपयुक्त नहीं है और सबसे अधिक थ्रेडेड अनुप्रयोग है। इसका उप-प्रोसेसैस के उत्पादन पर कोई प्रभाव नहीं पड़ता है हालांकि, कई उपयोगिता स्क्रिप्ट के लिए यह अभी भी एक उपयोगी तरीका है।

यह संदर्भ प्रबंधक रीएन्ट्रेंट है

पायथन में फाइल पढ़ने और लिखने के बारे में इस लिंक पर एक नज़र डालें । यह आपको विभिन्न तरीकों से फाइल करने के लिए चीजें लिखने के लिए एक महसूस करनी चाहिए।