मेरे पास एक पाइथन स्क्रिप्ट है जो मेरे नियोक्ता द्वारा प्रदान किए गए कुछ बंद-बॉक्स पायथन कार्यों का उपयोग कर रही है (यानी मैं इन कार्यों को संपादित नहीं कर सकता)। जब मैं इन कार्यों को कॉल करता हूं, तो वे मेरे लिनक्स टर्मिनल पर आउटपुट प्रिंट कर रहे हैं जिन्हें मैं दबाना चाहता हूं। मैंने stdout/stderr के माध्यम से पुनर्निर्देशित करने का प्रयास किया है;पायथन कार्यों से stdout/stderr प्रिंट को दबाएं
orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
लेकिन यह आउटपुट को पकड़ने में विफल रहता है। मुझे लगता है कि मैं जिन कार्यों के माध्यम से कॉल कर रहा हूं- पाइथन (ऊपर से rogue_function()) वास्तव में संकलित सी-कोड के लिए रैपर हैं, जो वास्तव में प्रिंटिंग कर रहे हैं।
क्या किसी को इस तरह से पता है कि मैं किसी फ़ंक्शन द्वारा stdout/stderr को किसी भी प्रिंट को "गहरा कैप्चर" कर सकता हूं (और किसी भी उप-फ़ंक्शंस जो कॉल करता है)?
अद्यतन:
:# Define a context manager to suppress stdout and stderr.
class suppress_stdout_stderr(object):
'''
A context manager for doing a "deep suppression" of stdout and stderr in
Python, i.e. will suppress all print, even if the print originates in a
compiled C/Fortran sub-function.
This will not suppress raised exceptions, since exceptions are printed
to stderr just before a script exits, and after the context manager has
exited (at least, I think that is why it lets exceptions through).
'''
def __init__(self):
# Open a pair of null files
self.null_fds = [os.open(os.devnull,os.O_RDWR) for x in range(2)]
# Save the actual stdout (1) and stderr (2) file descriptors.
self.save_fds = [os.dup(1), os.dup(2)]
def __enter__(self):
# Assign the null pointers to stdout and stderr.
os.dup2(self.null_fds[0],1)
os.dup2(self.null_fds[1],2)
def __exit__(self, *_):
# Re-assign the real stdout/stderr back to (1) and (2)
os.dup2(self.save_fds[0],1)
os.dup2(self.save_fds[1],2)
# Close all file descriptors
for fd in self.null_fds + self.save_fds:
os.close(fd)
इस तुम सिर्फ का उपयोग करें:
मैं विधि नीचे चयनित जवाब में उल्लिखित ले रहे हैं और एक संदर्भ प्रबंधक लेखन stdout और stderr को दबाने के लिए समाप्त हो गया
with suppress_stdout_stderr():
rogue_function()
यह "बहुत अच्छा" काम करता है। यह प्रिंट स्क्रिप्ट को उन दुष्ट कार्यों से दबाता है जो मेरी लिपि को छेड़छाड़ कर रहे थे। मैंने परीक्षण में देखा कि यह उठाए गए अपवादों के साथ-साथ कुछ लॉगर प्रिंट के माध्यम से भी देता है, और मैं पूरी तरह स्पष्ट क्यों नहीं हूं। मुझे लगता है कि के साथ ऐसा कुछ करने के लिए है जब ये संदेश stdout/stderr को भेजे जाते हैं (मुझे लगता है कि यह मेरे संदर्भ प्रबंधक से बाहर निकलने के बाद होता है)। किसी को भी इस बात की पुष्टि कर सकते हैं, मैं विवरण सुनने में रुचि रखते आप एक linux आधारित मशीन पर इस स्क्रिप्ट चला रहे हैं हो जाएगा ...
करता है [इस दृष्टिकोण] (http://stackoverflow.com/a/978264/344821) में के रूप में चयन करने के लिए (अनुमति देता है संबंधित साइडबार) काम करते हैं? – Dougal
'sys.stdout' को 'स्ट्रिंगियो()' में सेट करने के बजाय, क्या आपने इसे फ़ाइल में सेट करने का प्रयास किया है? यानी 'sys.stdout = open (' log.txt ',' w ') ' – carmenism
डगल, धन्यवाद, यह आशाजनक लग रहा है, मैं कल इसे आजमाउंगा। nullpointer, मैंने इसे एक कस्टम NullPointer() कक्षा में निर्देशित करने की कोशिश की, और यह भी काम नहीं किया। – jeremiahbuddha