पाइथॉन में चाइल्ड प्रोसेस के परिणामों को फाइलों और टर्मिनल पर एक साथ कैसे आउटपुट करें
सबप्रोसेस.कॉल() को नियोजित करते समय, यह निर्दिष्ट करना संभव है stdout और stderr को विशिष्ट फ़ाइलों पर पुनर्निर्देशित करने के लिए outf और errf के रूप में फ़ाइल डिस्क्रिप्टर। हालाँकि, ये परिणाम टर्मिनल में समवर्ती रूप से प्रदर्शित नहीं होंगे। stdout=चाईल्ड प्रक्रिया के stdout से पढ़ने के लिए PIPE तर्क। यहां बताया गया है:
उपप्रक्रिया आयात करें थ्रेडिंग से थ्रेड आयात करें डीईएफ़ टी(इनफ़ाइल, *फ़ाइलें): # एक अलग थ्रेड में आउटपुट को `इनफाइल` से `फाइल` तक अग्रेषित करें डीईएफ़ फ़ैनआउट(इनफ़ाइल, *फ़ाइलें): iter में लाइन के लिए(infile.readline, ""): फ़ाइलों में f के लिए: एफ.लिखें(पंक्ति) t = थ्रेड(लक्ष्य=फैनआउट, args=(infile,) फ़ाइलें) टी.डेमन = सत्य टी.स्टार्ट() वापसी टी डीईएफ़ टीड_कॉल(cmd_args, **kwargs): # मानक आउटपुट कैप्चर करने के लिए PIPE के साथ `stdout` और `stderr` तर्कों को ओवरराइड करें stdout, stderr = [kwargs.pop(s, None) for s in ["stdout", "stderr"]] पी = सबप्रोसेस.पोपेन( cmd_args, stdout=subprocess.PIPE यदि stdout कोई नहीं है और कोई नहीं, stderr=subprocess.PIPE यदि stderr कोई नहीं है और कोई नहीं, **क्वार्ग्स ) # फ़ाइलों और टर्मिनल पर एक साथ लिखने के लिए थ्रेड बनाएं धागे = [] यदि stdout कोई नहीं है: threads.append(tee(p.stdout, stdout, sys.stdout)) यदि stderr कोई नहीं है: threads.append(tee(p.stderr, stderr, sys.stderr)) # आगे बढ़ने से पहले IO पूरा होना सुनिश्चित करने के लिए थ्रेड्स से जुड़ें धागे में टी के लिए: टी.जुड़ें() return p.wait()
इस फ़ंक्शन का उपयोग करके, हम चाइल्ड प्रक्रियाओं को निष्पादित कर सकते हैं और एक ही समय में दोनों फाइलों और टर्मिनल पर उनका आउटपुट लिख सकते हैं:outf, errf = open ("out.txt", "wb"), open("err.txt", "wb")
teed_call(["बिल्ली", __फ़ाइल__], stdout=कोई नहीं, stderr=errf)
teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0)
teed_call(["gcc", "a b"],close_fds=True, stdout=outf, stderr=errf)
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3