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




capture (2)

इस संदर्भ प्रबंधक का प्रयास करें:

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']

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

do_something(my_object)

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

out = do_something(my_object)

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

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

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

?


पायथन> = 3.4 में, contextlib में एक redirect_stdout सजावट है। इसका उपयोग आपके प्रश्न का उत्तर देने के लिए किया जा सकता है:

import io
from contextlib import redirect_stdout

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

redirect_stdout :

अस्थायी रूप से sys.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 पर वैश्विक दुष्प्रभाव का अर्थ है कि यह संदर्भ प्रबंधक लाइब्रेरी कोड और अधिकांश थ्रेडेड अनुप्रयोगों में उपयोग के लिए उपयुक्त नहीं है। यह उपप्रोसेस के उत्पादन पर भी कोई प्रभाव नहीं पड़ता है। हालांकि, यह अभी भी कई उपयोगिता स्क्रिप्ट के लिए एक उपयोगी दृष्टिकोण है।

यह संदर्भ प्रबंधक पुनर्विक्रेता है।







capture